【问题标题】:How to exclude a specific string with REGEX? (Perl)如何使用 REGEX 排除特定字符串? (Perl)
【发布时间】:2022-12-14 21:59:26
【问题描述】:

例如,我有这些字符串

APPLEJUCE1A
APPLETREE2B
APPLECAKE3C
APPLETEA1B
APPLEWINE3B
APPLEWINE1C

我想要所有这些字符串,但其中包含 TEAWINE1C 的字符串除外。

APPLEJUCE1A
APPLETREE2B
APPLECAKE3C
APPLEWINE3B

我已经尝试过以下方法,但没有用:

^APPLE(?!.*(?:TEA|WINE1C)).*$

感谢您的帮助,因为我对此也很陌生。

【问题讨论】:

  • 使用匹配您要排除的内容的 RE,然后只允许匹配失败的内容。
  • 您的模式似乎有效 regex101.com/r/ejIpEV/1 这些不是预期的匹配项吗?
  • 例如perl -ne 'print unless /TEA|WINE1C/' input.txt
  • ^((?!TEA|WINE1C).)*$
  • 没有同时包含 TEA 和 WINE1C 的字符串。

标签: regex perl


【解决方案1】:

如果您确实如您所说的那样拥有多个字符串,则无需将所有字符串都塞进一个正则表达式模式中。

/^APPLE/ && !/TEA|WINE1C/

如果你只有一个字符串,最好的方法可能是将它拼接成行 (split / /),但你也可以使用单个正则表达式匹配

/^APPLE(?!.*TEA|WINE1C).*/mg

【讨论】:

  • 我赞成两个​​正则表达式解决方案。那样更难搞砸。
【解决方案2】:

您可以使用

^APPLE(?!.*TEA)(?!.*WINE1C).*

请参阅regex demo

细节:

  • ^ - 字符串的开头
  • APPLE - 固定字符串
  • (?!.*TEA) - 不允许TEA位于当前位置右侧的任何位置
  • (?!.*WINE1C) - 不允许WINE1C位于当前位置右侧的任何位置
  • .* - 尽可能多的除换行符以外的任何零个或多个字符。

【讨论】:

    【解决方案3】:

    如果您不想匹配同时具有两者或它们的字符串(不在当前示例数据中):

    ^APPLE(?!.*(WINE1C|TEA).*(?!)(?:TEA|WINE1C)).*
    

    解释

    • ^ 字符串开始
    • APPLE字面匹配
    • (?!负前瞻
      • .*(WINE1C|TEA) 捕获组 1 中的任一值
      • .*匹配0+个字符
      • (?!)(?:TEA|WINE1C) 匹配其中一个值,只要它与先前在第 1 组中匹配的值不同
    • )关闭前瞻
    • .* 匹配该行的其余部分

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-09-26
      • 1970-01-01
      • 2020-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-24
      相关资源
      最近更新 更多