java:查找模式的完整匹配

时间:2013-07-23 09:22:05

标签: java pattern-matching

我有一个函数,它在一个冗长的字符串中找到一个单词。

如果变量“v”包含<vocab></vocab>

之间的字符串,则该行匹配
if(p.matches("\\W"+v+"\\W"))

我希望这一行应该匹配,v是\ n或\ t \ t \ t或空格之间的完整单词,并且不包含在另一个单词中。

这是我的字符串:

<meta>
<vocab>called</vocab>
</meta>
<para>
called to-VP,Reid-NP,television cameras-NP
called to-VP,Reid-NP,one of-NP
one of-VP,Reid-NP,ornate rooms-NP
called to-VP,Reid-NP,Capitol-NP
called to-VP,Reid-NP,ceremony-NP
passed on-VP,last week-NP,spending bill-NP
passed on-VP,last week-NP,House-NP
passed on-VP,last week-NP,Senate-NP
officially complete-VP,ceremony-VP/NP,action-NP
called to-VP,television cameras-NP,one-NP
called in-VP,television cameras-NP,Capitol-NP
called for-VP,television cameras-NP,ceremony-NP
called-VP,Reid-NP,television cameras-NP
age-NP,last week-NP,event-num
</para>

2 个答案:

答案 0 :(得分:0)

我建议您使用Pattern.quote(regex)作为变量v,因为它可以包含一些正则表达式元字符。还要确保匹配完整的单词使用单词边界。所以你的模式看起来像:

Pattern p = Pattern.compile("\\b" + Pattern.quote(v) + "\\b");

答案 1 :(得分:0)

正确的正则表达式是:

if (p.matches("(?s).*\\b" + v + "\\b.*"))

这里有一些重点:

  • (?s)表示&#34; dot匹配换行符&#34;,因此它可用于多行输入
  • 使用正则表达式\b,这是一个&#34;字边界&#34;
  • String.matches()必须与整个字符串匹配才能返回true,因此两端的.*都匹配整个字符串