java - 查找单个正则表达式以获取两个特定单词之间的 3 个或更多字符的单词

标签 java regex

我正在寻找一个正则表达式(在 Java 中使用)来获取以下所有句子中以下单词(Peach、Apple)之间的所有 3 个字符或更多单词:

Peach are nice fruits. Apple are not.

此时,我正在使用以下部分:

\w{3,}\b

获取所有 3 个以上的字符单词。我正在使用正面和负面的后视来获取 PeachApple 之间的词,如下所示:

(?<=Peach).*(?=Apple).

我不能使用两个正则表达式,也不能使用子字符串或任何其他技术。只有一个正则表达式来提取单词。

最佳答案

您可以使用 \G回顾一下:

Pattern p = Pattern.compile("(?<=(?:\\bPeach\\b|\\G)\\W).*?\\b((?!Apple\\b)\\w{3,})\\b");

String msg = "Peach a nice family of fruits. Apple are not.";
Matcher m = p.matcher( msg );

while (m.find()) {
    System.out.println( m.group(1) );
}
  • \G断言位置在上一个匹配项的末尾或第一个匹配项的字符串的开头。
  • (?<=(?:\\bPeach\\b|\\G)\|W)将断言文字 "Peach "\G回顾过去
  • (?!Apple\\b)将确保完整的单词 Apple不领先当前位置
  • \\b\\w{3,}\\b将在 0 个或多个任意字符之后匹配具有 3 个或更多字符的完整单词。

输出:

nice
family
fruits

如果字符串中有多个Peach和Apple那么你可以使用:

String msg = "Peach, a nice family of fruits. Apple are not. Another Peach foo bar is here Apple end.";
Pattern p = Pattern.compile(
      "(?:(?<=\\bPeach\\b|\\G)\\W)(?:(?!\\bApple\\b).)*?\\b((?!Apple\\b)\\w{3,})\\b");

Matcher m = p.matcher(msg);
while (m.find()) {
    System.out.println(m.group(1));
}

输出

nice
family
fruits
foo
bar
here

RegEx Demo


这个看起来笨拙的正则表达式可能会处理许多边缘情况,但只有在要求嵌套/不平衡时才应使用它 Peach/Apple对:

(?:(?<=\bPeach\b(?!(?:(?!\bApple\b).)*?\bPeach\b)|\G)\W)(?:(?!\bApple\b).)*?\b((?!Apple\b)\w{3,})\b

RegEx Demo 2

关于java - 查找单个正则表达式以获取两个特定单词之间的 3 个或更多字符的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415895/

相关文章:

java - 递归 - Java 编程

python - 了解 Python 中的 're.search()' 行为

java - 在Java正则表达式中向字符类添加方括号

java - 如何仅当后面的字符是数字而前一个字符是字母时才用 "-"分割字符串? Java/Scala

javascript - 正则表达式匹配没有连续空格的用户名

MySQL REGEXP 匹配逗号分隔列表中的零

java - 获取pdf中包含特定单词的页码

java - Javascript和Java进行相同的验证

java - 通过 Spring MVC 下载大文件

java - 检查字符串是否为回文(使用 char[] 输入而不是字符串)