你可以帮我用正则表达式来匹配两个最接近的单词之间的文字吗?
例如:
text KEYWORD1 text KEYWORD1 text KEYWORD2 text KEYWORD2
结果必须是:
KEYWORD1 text KEYWORD2
这不起作用,这是可以预测的:
(KEYWORD1).*(KEYWORD2)
使用regexp甚至可以实现这一目标吗?如果是这样,它将如何与有限状态机一起使用?
Java regexp语法是最好的。提前谢谢!
答案 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());
}
检查此图以了解其工作原理:
第一个捕获小组((.(?!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