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”不匹配