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

标签 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”;但应该排除:

示例文本:

...你应该 不是 ß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 而不是采取),dwellsay .
我试图排除 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/

    相关文章:

    c# - 两个timer_tick事件是否不能并行读取相同的数据但执行不同的任务?

    mysql - 正则表达式中的通配符?

    multithreading - Delphi:Indy TIdTCPClient 读取数据

    oracle - Delphi XE 5试用-ORA-12154问题

    ios - Delphi/Firemonkey ios知道当应用程序在前台时何时显示本地通知

    delphi - Coinitialize(nil) 和 CoInitializeEx(0, COINIT_MULTITHREADED) 区别

    java - 使用大数据进行测试时,正则表达式需要花费大量时间

    c# - 如何在删除子字符串后获取剩余字符串

    javascript - 密码只能包含某些字符 - javascript

    delphi - 是否有 DCC32.exe 命令行开关使其使用/创建 .dcu 文件?