我正在使用 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”;但应该排除:
示例文本:
...你应该 不是 ßeat每个...
像这样的动词应该包含在结果中:
示例文本:
以免他应该 把 伸出他的手……
现在我将解释带有 ß 符号的部分。 ß 符号表示原文有“not”字,然后是动词。但是我在之前的交互或 session 中更改了此文本,因此我现在正在工作的源文本如上所述。模式
([^ß\W]\w{2,15})
应避免使用否定意义的词。这也是为什么不包括“否定”动词的原因。所以问题的重点是如何从捕获的文本中排除“非”词;即 - 被此模式捕获,即
([^ß\W]\w{2,15})
或 (\W{3,15})
.我正在使用这种模式来替换文本中的子字符串。
需要更多示例文本吗?
than I can bear. And
so I might have taken her
they might dwell together
they could not ßdwell together
lest you should say,
在第 3 组中,我期待比赛:
对于
bear
, taken
(或可能 have
而不是采取),dwell
和 say
.我试图排除
not
词,所以 not
之后的任何动词或词必须完全排除在第三组或比赛之外。我只对第 3 组感兴趣。第 1 组和第 2 组仅指定动词前的替代项。
最佳答案
您可以使用 branch reset group如果有 not
则匹配一个空字符串作为情态动词之后的一个完整词,或者是一个概念动词之后:
\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
- 匹配并捕获除 ß
之外的任何单词字符到第 3 组然后是 2 到 15 个单词字符,后面跟着一个单词边界。 请注意
(?m)
- PCRE_MULTILINE
- 仅当您想要 ^
时才需要和 $
字符类之外的匹配行的开头和结尾而不是整个字符串。由于您的模式没有这样的 anchor ,(?m)
是多余的。
关于regex - 如何从正则表达式子模式中排除一个单词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52542946/