如何在代码生成的正则表达式中否定短语?

时间:2019-04-25 14:28:50

标签: java regex

我有一些Java代码生成的正则表达式。它用于计算一长串单词的出现次数。

数据:

  

我有兴趣做一些有趣的事情。我不是   对任何不令人兴奋的事物感兴趣。请保持我   感兴趣。

示例:

\b(interested|fun|enjoyable|exciting)\b

计数为:兴趣(3)+乐趣(1)+愉快(1)+令人兴奋(1)总计:6

我想忽略一些我认为不应该包括在内的已定义短语。可能是任何东西。在这种情况下,我想排除“不感兴趣”和“不令人兴奋”。

棘手的部分是我在代码中生成了此代码,因此我希望该过程非常简单和可靠。

1 个答案:

答案 0 :(得分:1)

由于您仅查找关键字/词组的计数,因此最简单的方法可能是像您一样获取该计数,然后从中计算出更广泛的词组,您要排除匹配项。从前者的数量中减去后者的数量。

确定较宽泛的短语以排除在外的一般规则可能是计算语言学中的一项复杂练习,但是如果您只想在匹配的短语前面加上“ not”则排除匹配的短语,则相对容易:

String keywordsSubPattern = "\b(interested|fun|enjoyable|exciting)\b";
String negatedKeywordsSubPattern = "\bnot\s+" + keywordsSubPattern;

int keywordCount = countOfMatchesToPattern(keywordsSubPattern)
        - countOfMatchesToPattern(negatedKeywordsSubPattern);

您可以通过在关键字模式中插入否定的lookbehind断言来做到这一点,以确保它与否定的版本最初不匹配,但是lookbehind断言不能与匹配可变长度的模式一起使用序列。由于\bnot\s+量词,+就是这种模式。但是,如果您只想排除以“ not”和完全相同的空格字符开头的关键字,则可以执行以下操作:

String keywordsSubPattern = "\b(interested|fun|enjoyable|exciting)\b";
String unnegatedKeywordsSubPattern = "(?<!\bnot\s)" + keywordsSubPattern;

int keywordCount = countOfMatchesToPattern(unnegatedkeywordsSubPattern);
相关问题