【问题标题】:Filter strings using regular expression使用正则表达式过滤字符串
【发布时间】:2019-10-10 21:04:45
【问题描述】:

我想使用正则表达式在文本文件中查找满足以下所有要求的多个字符串。

  • 长度为 3
  • 全部由大写字母组成
  • 第一个字符不是“A”
  • 第二个字符不是“J”
  • 第三个字符不是“K”

我从这个开始:/[A-Z]{3}/,但由于某种原因,它也匹配小写的 3 个字母字符串。

这可能吗?任何指导表示赞赏。

【问题讨论】:

  • [A-Z] 只能匹配小写字母,前提是您启用了不区分大小写的匹配。
  • 您需要锚定您的正则表达式,否则它将匹配行中的任何位置。所以应该是/^[A-Z]{3}$/
  • 您可以使用:/[B-Z][A-IK-Z][A-JL-Z]/
  • 此外,您需要匹配所有 Unicode 字母还是只匹配 ASCII 字母?

标签: regex regex-negation


【解决方案1】:

您需要锚定正则表达式,使其与整行匹配。否则,它将匹配一个长度超过 3,但在其中任意位置包含 3 个大写字母的字符串。

您可以为每个字符使用字符集。

/^[B-Z][A-IK-Z][A-JL-Z]$/

^ 匹配行首。 [B-Z] 匹配任何不是A 的大写字母,[A-IK-Z] 匹配除J 之外的任何字母,[A-JL-Z] 匹配除M 之外的任何字母。 $ 匹配行尾。

【讨论】:

    【解决方案2】:

    另一种使用前瞻的解决方案:

    ^(?=[A-Z]{3}$)[^A][^J][^K]$
    

    Demo & explanation

    【讨论】:

      【解决方案3】:

      尝试以下返回所有匹配项:/\b(?=[A-Z])[^A](?=[A-Z])[^J](?!=[A-Z])[^K]\b/g

      它利用前瞻,将仅返回 3 个字母匹配,并且对于任何其他变体 A、J、K 可以相对容易地重复

      演示:https://regex101.com/r/5s2Gkj/1

      【讨论】:

        猜你喜欢
        • 2012-10-13
        • 1970-01-01
        • 2020-09-12
        • 1970-01-01
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        • 2013-09-23
        • 1970-01-01
        相关资源
        最近更新 更多