input1="caused/VBN by/IN thyroid disorder"

要求:找到单词"caused",后跟斜杠,后跟任意数量的大写字母-而不是空格+ "by/IN

在上面的示例中,"caused/VBN"后跟" by/IN",因此“caused”不应匹配。
input2="caused/VBN thyroid disorder"
"by/IN"未遵循引起的,因此应匹配
regex="caused/[A-Z]+(?![\\s]+by/IN)"
caused/[A-Z]+-单词'caused'+ / +一个或多个大写字母(?![\\s]+by)-否定超前-不匹配空格且

下面是我用来测试的一种简单方法
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());
    }

输出:caused/VB
我不明白为什么我的负面前瞻正则表达式无法正常工作。

最佳答案

您需要在正则表达式中包括单词边界:

String regex = "caused/[A-Z]+\\b(?![\\s]+by/IN)";

没有它,您可以得到一场比赛,但不能达到您的期望:

“由/由甲状腺疾病引起的/ VBN”;
^^^^^^^^^^
之所以匹配,是因为“N by”与“[\\ s] + by”不匹配

10-06 13:30