如何从正则表达式子模式中排除单词?

时间:2018-09-27 18:16:52

标签: regex delphi

我正在使用Delphi 7和TDIPerlRegEx。我正在寻找句子中包含某些特定部分的动词,以识别动词。

s1 := '(I|you|he|she|it|we|they|this|that|these|those)';
s2 := (can|should|would|could|must|want to|have to|had to|might);
RegEx_Seek_1.MatchPattern := '(*UCP)(?m) \b'+s1+'\b \b'+s2+'\b \K([^ß\W]\w{2,15})\b';

错误地包含在结果中的关键字是“ not”;但应排除在外:

示例文字:

...您应该不要每个……都吃

这样的动词应包括在结果中: 示例文字:

不要让他伸出他的手...

现在,我将用ß符号解释该部分。 ß符号表示,原始文本中带有“ not”字样,然后是动词。但是我在先前的交互或会话中更改了此文本,因此我现在正在使用的源文本如上所述。模式([^ß\W]\w{2,15})应该避免使用否定的单词。这也是为什么不包括“否定”动词的原因。

因此,问题的关键是如何从捕获的文本中排除“ not”一词; -由此模式捕获,即([^ß\W]\w{2,15})(\W{3,15})

我正在使用此模式替换文本中的子字符串。

需要更多示例文本吗?

  

比我能承受。还有

     

所以我可能带走了

     

他们可能一起住

     

他们不能在一起

     

请您

在第3组中,我期望比赛: beartaken(或者可能是have,而不是{},dwellsay。 我正在尝试排除not单词,因此not之后的任何动词或单词都必须从第三组或完全匹配项中排除。我只对第3组感兴趣。第1组和第2组仅在动词之前指定替代项。

1 个答案:

答案 0 :(得分:2)

如果在情态动词或概念性动词后的整个单词中有not作为整个单词,则可以使用branch reset group来匹配空字符串:

\b(I|you|he|she|it|we|they|this|that|these|those)\s+(can|should|would|could|must|want to|have to|had to|might)\s+\K(?|(?=not\b)()|([^ß\W]\w{2,15})\b)

请参见regex demo

详细信息

  • \b-单词边界
  • (I|you|he|she|it|we|they|this|that|these|those)-第1组中的代词之一
  • \s+-1个以上的空格(它已经作为相邻组两侧的单词边界)
  • (can|should|would|could|must|want to|have to|had to|might)-情态动词之一
  • \s+-超过1个空格
  • \K-匹配重置运算符
  • (?|(?=not\b)()|([^ß\W]\w{2,15})\b)-分支重置组与以下任一匹配
    • (?=not\b)()-如果在整个单词的紧前面是not,则将一个空字符串捕获到第3组中
    • |-或(此处为其他)
    • ([^ß\W]\w{2,15})\b-将ß以外的任何其他字符char匹配并捕获到第3组中,然后将2到15个具有字符边界的字符char捕获并分组。

请注意,(?m)-PCRE_MULTILINE-仅在您希望字符类之外的^$行的开头和结尾匹配时才需要而不是整个字符串。由于您的模式没有此类锚点,因此(?m)是多余的。