在TokensRegex中开始/结束正则表达式

时间:2016-10-31 14:13:42

标签: java regex stanford-nlp

假设我有以下代码:

TokenSequencePattern p = TokenSequencePattern.compile("[{tag:/JJ.*/}] [{tag:/NN.*/}]");
TokenSequenceMatcher m = tPattern.getMatcher(coreLabelList);
while (tMatcher.find()){
    List<CoreMap> matches = m.groupNodes();
}

我想在这里捕捉的是一个形容词后面跟一个名词,即它必须以一个形容词开头,它必须以一个名词结尾。例如,如果我有漂亮的围巾&#34;它应该是一个匹配,但如果我有&#34;漂亮的白色圆点围巾&#34;它不应该是一个匹配。目前,上面的令牌正则表达式是两个短语的匹配。如何指定序列的确切开头及其确切结束?

1 个答案:

答案 0 :(得分:1)

您可以使用

TokenSequencePattern p = TokenSequencePattern.compile("[tag:/JJ.*/] [tag:/NN.*/]");

使用A round ball is bouncing very high in to the blue sky.进行测试,产生了round ballblue sky子字符串。

要仅获取整个字符串匹配,如果要使用Matcher#find()(使用Matcher#matches(),则需要使用 anchors 暗示)。

所以,要仅将round ball字符串与形容词和名词的组合匹配,您可以使用

TokenSequencePattern p = TokenSequencePattern.compile("^[tag:/JJ.*/] [tag:/NN.*/]$");

TokenSequencePattern p = TokenSequencePattern.compile("\\A[tag:/JJ.*/] [tag:/NN.*/]\\z");

^ / \A代表字符串的开头(同样,\A将始终在字符串的开头匹配)和$ / {{1匹配字符串的结尾(请注意,\z将始终匹配字符串的最后一部分而\z - 即使您没有使用多行修饰符 - 也允许后面的尾随换行符)。

注意:锚点在CoreNLP 3.7.0上进行测试。他们不在某些版本上工作(例如,不在CoreNLP 3.5.1上工作,它会抛出错误:$