正则表达式匹配两个最接近的单词之间的文本

时间:2014-01-16 13:04:09

标签: java regex

你可以帮我用正则表达式来匹配两个最接近的单词之间的文字吗?

例如:

text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2

结果必须是:

KEYWORD1 text KEYWORD2

这不起作用,这是可以预测的:

(KEYWORD1).*(KEYWORD2)

使用regexp甚至可以实现这一目标吗?如果是这样,它将如何与有限状态机一起使用?
Java regexp语法是最好的。提前谢谢!

3 个答案:

答案 0 :(得分:7)

更新:

String val="text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2";
String REGEX="KEYWORD1((.(?!KEYWORD1))+?)KEYWORD2";
Pattern pattern = Pattern.compile(REGEX);
Matcher matcher = pattern.matcher(val);
if(matcher.find()){
    System.out.println(matcher.group());
}

检查此图以了解其工作原理:

enter image description here

Explanation :

第一个捕获小组((.(?!KEYWORD1))+?)

第二捕获小组(.(?!KEYWORD1))+?

量词(+?):在一次和无限次之间,尽可能少,根据需要扩展[懒惰]

  

注意:重复捕获组仅捕获最后一次迭代。   将捕获组放在重复组周围以捕获所有组   迭代或使用非捕获组,如果你不是   对数据感兴趣

.匹配任何字符(换行符除外) (?!KEYWORD1)否定前瞻 - 断言无法匹配下面的正则表达式 KEYWORD1字面匹配字符KEYWORD1(区分大小写) KEYWORD2字面匹配字符KEYWORD2(区分大小写)

答案 1 :(得分:1)

使用否定先行断言:

String myString =
    "text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2";
Pattern pattern = Pattern.compile("KEYWORD1((.(?!KEYWORD1))+?)KEYWORD2");
Matcher matcher = pattern.matcher(myString);
String word = "";
if (matcher.find())
    word = matcher.group(1);

// word => " text "

请参阅Demo

答案 2 :(得分:-1)

为什么不在apache commons中使用LevenshteinDistance?它只是你需要的。看看javadoc http://commons.apache.org/proper/commons-lang/javadocs/api-3.1/org/apache/commons/lang3/StringUtils.html

相关问题