2012-02-18 43 views
0

我正在Java中读取超过100000个字符的字符串。 我有一个关键字的列表,我搜索字符串,如果字符串存在,我调用一个函数,做一些内部处理。正则表达式不提取确切模式

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

我写的正则表达式

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

其中关键字是我的关键字的列表,但我没有得到预期的效果。你能阅读我的描述,并请建议什么可能是问题,以及我如何解决它?

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

谢谢贡献者..

编辑

我知道它不工作时我用下面的代码的原因:

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

它不起作用?缺少什么字符串? – 2012-02-18 16:42:17

+0

您需要将备选选项加括号,但在您的情况下更好地执行'+'s?\\ s +“'以使's'可选。另外,请确保'+ Pattern.quote(关键字)+'您的关键字,否则它们可能会混淆您的模式。 – Irfy 2012-02-18 16:47:31

+0

我经常使用[this](http://www.regular-expressions.info/tutorial.html)网站作为教程/参考 – Vic 2012-02-18 16:55:18

回答

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的。)

0

应使用

图案P = Pattern.compile( “\ B” +关键字+ “S \ B'”);

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

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