Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用于匹配句子中最后一个字母和单词的正则表达式_Java_Regex - Fatal编程技术网

Java 用于匹配句子中最后一个字母和单词的正则表达式

Java 用于匹配句子中最后一个字母和单词的正则表达式,java,regex,Java,Regex,用于搜索单词以及返回行中最后一个字符的正则表达式。 到目前为止,我得到的是->“[a-z]$|[a-zA-z]+” 正文是“很多???很好” 问题是“are”得到了匹配,而不是“e”,第二个正则表达式模式得到了优先权。我希望“are”与“e”匹配 有解决方案吗?使用捕获组: ([a-zA-Z]+([a-z]))$ 看 对于文本多???Wooooords是,是在组1中捕获,而e在组2中捕获。您可以使用以下方法: ([a-zA-Z]+)|([a-zA-Z]+([a-zA-Z]))$ 这将捕获文本

用于搜索单词以及返回行中最后一个字符的正则表达式。 到目前为止,我得到的是->“[a-z]$|[a-zA-z]+”

正文是“很多???很好”

问题是“are”得到了匹配,而不是“e”,第二个正则表达式模式得到了优先权。我希望“are”与“e”匹配

有解决方案吗?

使用捕获组:

([a-zA-Z]+([a-z]))$

对于文本<代码>多???Wooooords是,
在组1中捕获,而
e
在组2中捕获。

您可以使用以下方法:

([a-zA-Z]+)|([a-zA-Z]+([a-zA-Z]))$

这将捕获文本中的所有单词以及最后一个字母。您需要将“g”修饰符(全局)与正则表达式一起使用。

至少在.NET、Java、Javascript和PHP中(似乎是标准的),组[0]包含所有匹配项本身,因此您只需要将正则表达式中的最后一个字母分组

[a-zA-Z]+([a-zA-Z])$

“很多???呜呜的是”

您的文本如下所示:

组[0]=“是”


组[1]=“e”

主要问题是正则表达式不能多次使用文本。您只能捕获重叠的文本,并且可以在lookarounds中进行捕获

因此,您可以使用

(?s)^(?=.*([a-z])$)|[a-zA-Z]+

说明:

  • (?s)
    -打开点调用模式,以便
    可以匹配换行符
  • ^
    -字符串的开头
  • (?=.*([a-z]))
    -检查所有字符串并捕获最后一个字母的正向前瞻。如果有尾随空格,请将其替换为
    (?=.*([a-z])\\s*$)
    。注意:您可以使用
    \\p{Ll}
    匹配Unicode小写字母
  • |
    -或
  • [a-zA-Z]+
    -1个或多个字母(您实际上可以在Java中使用
    \\pL
    ,而不使用此选项来允许匹配Unicode字母)
由于它是Java,您只需要检查第一个组是否不是
null
,如果不是,您就得到了最后一个字母。如果第一组为空,则得到一个单词

String s = "many??? Woooooooooooords are"; 
Pattern pattern = Pattern.compile("(?s)^(?=.*([a-z])$)|[a-zA-Z]+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()){
    if (matcher.group(1) != null) {
        System.out.println("Last letter: " + matcher.group(1));
    }
    else {
        System.out.println("Word found: " + matcher.group(0)); 
    }
} 

请参见

此正则表达式的速度是[a-zA-Z]的两倍+($(?您可以使用,但需要一些代码才能从中提取正确的文本。主要问题是正则表达式不能多次使用文本。您只能捕获重叠的文本,并且可以在lookarounds中执行。@Deven:您使用的语言是什么?如果您计划使用1 pat,我想我的正则表达式在这里是最好的tern为了得到你想要的,只是从捕获的组中提取值对你来说可能真的很棘手。我假设你想找到所有的单词,如果它恰好是行中的最后一个单词,那么就用它来获取。但是,最后一个单词不会首先匹配。只需使用
[a-zA-Z]*([a-zA-Z])
。全局查找中的最后一个匹配项将包含最后一个单词中的最后一个字母。您无法区分小写字母,使用它添加
$
eos标记不会与其他
[a-zA-Z]一起使用
如果您首先需要最后一个字符,请将其分成两个正则表达式。@Stribizev:您是对的,您的答案在这里是最有用的。这里的其他答案与句子中的其他单词不匹配,只有“是”。我还想匹配标点以查找集合的数量,因此我提出了此方法。但是现在,java代码似乎返回空字符,即使正则表达式是正确的。需要更多的工作…如果是java,我可以提供帮助
Regex1:   [a-zA-Z]+($(?<=[a-z]))?
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   8
Elapsed Time:    0.68 s,   679.77 ms,   679771 µs


Regex2:   ^(?s)(?=.*([a-z])$)|[a-zA-Z]+
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   8
Elapsed Time:    1.14 s,   1139.35 ms,   1139345 µs
Regex1:   [a-zA-Z]+($(?<=[a-z]))?
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   8
Elapsed Time:    0.68 s,   678.97 ms,   678965 µs


Regex2:   ^(?s)(?=.*([a-z])$)|[a-zA-Z]+
Options:  < none >
Completed iterations:   50  /  50     ( x 1000 )
Matches found per iteration:   9
Elapsed Time:    0.72 s,   717.28 ms,   717276 µs