TokensRegex(来自Standford CoreNLP库的模块)支持& (AND)运营商。据我了解,你可以使用模式'X& Y'匹配包含X和Y的任何序列。但是当我在实际代码中使用运算符时,它不像我预期的那样工作。这是我的Java代码:
String content = "data is here and everywhere";
String pattern = "data & is";
TokenizerFactory tf = PTBTokenizer.factory(new CoreLabelTokenFactory(), "");
List<CoreLabel> tokens = tf.getTokenizer(new StringReader(content)).tokenize();
TokenSequencePattern seqPattern = TokenSequencePattern.compile(pattern);
TokenSequenceMatcher matcher = seqPattern.getMatcher(tokens);
if(matcher.find()){
System.out.println("Matched"); // <- I expected to have this printed out
} else {
System.out.println("Unmatched"); // <- But I've got this instead :(
}
请您告诉我我的代码或我的理解有什么问题?提前谢谢。
答案 0 :(得分:3)
对于给出的示例,matcher.find()
将尝试在输入标记序列中查找与两个条件匹配的子序列:
data
:一个带有单词data
is
:一个带有单词is
显然没有这样的序列。如果您想检查您的令牌序列是否包含单词data
和单词is
,您可以尝试使用该模式:
String pattern = "(?: ( []* data []* ) & ( []* is []* ))";
初始?:
表示不需要进行子组捕获,[]*
表示任意数量的可选令牌的通配符。
尽管TokensRegex提供了AND,但它并不是普通正则表达式的一部分。很可能还有其他方法(没有AND)来实现你想要的目标。