正则表达式不提取确切的模式

时间:2012-02-18 16:39:08

标签: java regex pattern-matching

我在Java中工作,读取超过100000个字符的字符串。 我有一个关键字列表,我搜索字符串,如果字符串存在,我调用一个函数进行一些内部处理。

我所拥有的关键词是“面子”,例如 - 我希望获得所有模式,其中我对“脸”而不是“脸谱”匹配。我可以接受字符串中面部后面的空格字符,所以如果在字符串中我有一个像“face”或“faces”或“face”或“faces”的匹配,我也可以接受。但是我不能接受“duckface”或“duckface”等。

我写过正则表达式

Pattern p = Pattern.compile("\\s+"+keyword+"s\\s+|\\s+");

其中keyword是我的关键字列表,但我没有得到理想的结果。你能阅读我的描述吗,请说明可能存在的问题以及我如何解决它?

此外,如果共享一个非常好的Java页面正则表达式的指针,我也会很感激。

谢谢Contributers ..

修改

我知道它不起作用的原因是我使用了以下代码:

Pattern p = Pattern.compile("\\s+"+keyword+"s\\s+|\\s+");
            Matcher m = p.matcher(myInputDataSting);
            if(m.find())
            {
                System.out.println("Its a Match: "+m.group());
}

这将返回一个空白字符串...

2 个答案:

答案 0 :(得分:4)

如果keyword"face",那么您当前的正则表达式为

\s+faces\s+|\s+

匹配 一个或多个空格字符,后跟faces,后跟一个或多个空白字符,一个或多个空格字符。 (管道|的优先级非常低。)

你真正想要的是

\bfaces?\b

匹配单词边界,后跟face,后跟s,后跟单词边界。

所以,你可以写:

Pattern p = Pattern.compile("\\b"+keyword+"s?\\b");

(但很明显,这仅适用于像face这样的单词,只需添加s)即可形成复数形式。

您可以在http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html找到Java的正则表达式支持的完整列表,但这并不是一个教程。为此,我建议只使用谷歌搜索“正则表达式教程”,找到一个适合你的。 (它不一定是特定于Java的:您将找到的大多数教程都是针对类似于Java的非常的正则表达式。)

答案 1 :(得分:0)

你应该使用

  

模式p = Pattern.compile(“\ b”+关键字+“s?\ b”);

,其中关键字不是复数。 \\ b表示关键字必须是搜索字符串中的完整单词。 S'表示关键字的值可能以s结尾。

如果你对正则表达式不熟悉,我建议你阅读http://docs.oracle.com/javase/tutorial/essential/regex/index.html,因为有例子和解释。