我正在使用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组中,我期望比赛:
bear
,taken
(或者可能是have
,而不是{},dwell
和say
。
我正在尝试排除not
单词,因此not
之后的任何动词或单词都必须从第三组或完全匹配项中排除。我只对第3组感兴趣。第1组和第2组仅在动词之前指定替代项。
答案 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)
是多余的。