Java 负前瞻正则表达式不工作
要求:在中查找单词Java 负前瞻正则表达式不工作,java,regex,regex-negation,regex-lookarounds,Java,Regex,Regex Negation,Regex Lookarounds,要求:在中查找单词“caused”,该单词后面跟斜杠,后面跟任意数量的大写字母,后面不跟空格+ 在上面的示例中,“coursed/VBN”后面跟着“”by/In“,因此“coursed”不应该匹配 input1="caused/VBN by/IN thyroid disorder" “by/IN”不遵循原因,因此它应该匹配 input2="caused/VBN thyroid disorder" resulted/[A-Z]+--单词“resulted”+/+一个或多个大写字母 (?![\
“caused”
,该单词后面跟斜杠,后面跟任意数量的大写字母,后面不跟空格+
在上面的示例中,“coursed/VBN”
后面跟着“
”by/In“,因此“coursed”不应该匹配
input1="caused/VBN by/IN thyroid disorder"
“by/IN”
不遵循原因,因此它应该匹配
input2="caused/VBN thyroid disorder"
resulted/[A-Z]+
--单词“resulted”+/+一个或多个大写字母(?![\\s]+by)
--负前瞻-不匹配空格和by
下面是我用来测试的一个简单方法
regex="caused/[A-Z]+(?![\\s]+by/IN)"
输出:导致/VB
我不明白为什么我的负前瞻正则表达式不起作用。您需要在正则表达式中包含单词边界:
public static void main(String[] args){
String input = "caused/VBN by/IN thyroid disorder";
String regex = "caused/[A-Z]+(?![\\s]+by/IN)";
Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(input);
while(matcher.find()){
System.out.println(matcher.group());
}
没有它,您可以获得匹配,但不是您所期望的:
String regex = "caused/[A-Z]+\\b(?![\\s]+by/IN)";
“甲状腺疾病引起的VBN”;
^^^^^^^^^
此匹配是因为“N by”与“[\\s]+by”不匹配
字符类[]+匹配将被调整(通过回溯),以便前瞻匹配 您需要做的是停止回溯,以便表达式[]+完全匹配。
这可以通过两种不同的方式实现
“导致(?=(/[A-Z]+)\\1(?!\\s+by/IN)”
“导致(?>/[A-Z]+)(?!\\s+by/IN)”
“造成的/[A-Z]++(?!\\s+by/IN)”
\\s
周围的括号是不必要的,不是吗?是的,它们完全是不必要的。+1-注意所有格加号也会起作用:引起/[a-Z]++(?![\s]+by/IN)
。谢谢你的评论。>>这是匹配的,因为“N by”与“[\\s]+by”不匹配“这是有道理的!谢谢你的回答,你的所有格量词建议很好——我需要读一点来理解你的其他建议。多谢!
"caused/VBN by/IN thyroid disorder";
^^^^^^^^^
this matches because "N by" doesn't match "[\\s]+by"