我在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());
}
这将返回一个空白字符串...
答案 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,因为有例子和解释。