我正在寻找一个正则表达式(在 Java 中使用)来获取以下所有句子中以下单词(Peach、Apple)之间的所有 3 个字符或更多单词:
Peach are nice fruits. Apple are not.
此时,我正在使用以下部分:
\w{3,}\b
获取所有 3 个以上的字符单词。我正在使用正面和负面的后视来获取 Peach
和 Apple
之间的词,如下所示:
(?<=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
这个看起来笨拙的正则表达式可能会处理许多边缘情况,但只有在要求嵌套/不平衡时才应使用它 Peach/Apple
对:
(?:(?<=\bPeach\b(?!(?:(?!\bApple\b).)*?\bPeach\b)|\G)\W)(?:(?!\bApple\b).)*?\b((?!Apple\b)\w{3,})\b
关于java - 查找单个正则表达式以获取两个特定单词之间的 3 个或更多字符的单词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32415895/