Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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_Regex Negation_Regex Lookarounds - Fatal编程技术网

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"