【问题标题】:Regex pattern force match with condition and not for another condition正则表达式模式强制匹配条件而不是另一个条件
【发布时间】:2020-01-15 17:48:09
【问题描述】:

我试图强制匹配这些条件:

  • 如果以 1,2,3 个数字 + 1 个空格 + 1 个字母结尾。
  • 如果模式在字符串中间匹配,则忽略它。

输入:

ME001000 RV 2 B

ME001000 G 10 B

ME001000 RE 321 B

MP260000 EQTE 1 A

EL008002P TR 06 A 1 不匹配,因为在字符串的中间

正则表达式模式:([0-9]{1} [A-Z]{1}|[0-9]{2} [A-Z]{1}|[0-9]{3} [A-Z]{1})+(?:[0-9]{2} [A-Z]{1}\s)

  1. 部分:([0-9]{1} [A-Z]{1}|[0-9]{2} [A-Z]{1}|[0-9]{3} [A-Z]{1}):匹配正确,但也与“06 A”(最后一个字符串的中间)匹配

  2. 部分:+(?:[0-9]{2} [A-Z]{1}\s):为了强制不匹配

我需要做什么来强制不匹配?

【问题讨论】:

    标签: regex string match regex-negation


    【解决方案1】:

    您要使用的正则表达式是:

    \d{1,3} [A-Z]$
    

    See Regex Demo

    1. \d{1,3} 匹配 1 到 3 位数字
    2. 匹配单个空格。
    3. [A-Z] 匹配大写字母。
    4. $ 匹配字符串的结尾。

    您最需要的是$ anchor,以确保您要查找的内容位于字符串的末尾。

    正则表达式演示使用 JavaScript 规范(您没有指定使用的语言)并使用标志 gmg 标志用于查找多个匹配项,m 标志用于$ 锚点,同时匹配行尾和字符串尾。

    正如 ggorlen 指出的,您可能需要考虑稍微修改一下:

    \b\d{1,3} [A-Z]$
    

    以上内容确保您尝试匹配的模式的第一个数字从单词边界开始(即,它前面是非单词字符或字符串的开头)。

    【讨论】:

    • 请记住,这将匹配 234 Afoobar234 A。如果你们两个添加(我认为必要的)单词边界意味着所有发布的答案都是相同的......¯\_(ツ)_/¯
    • @ggorlen 这是一个公平的观点,但从这个问题是否不完全清楚这是否是一个问题,但示例表明它可能是(或者该模式可能需要在前面专门加一个空格)。我在答案中添加了附录。
    【解决方案2】:

    试试这个:

    \d{1,3} [A-Za-z]$
    
    • \d = 任意数字
    • {1,3} = 重复匹配 1 到 3 次
    • = 文字空间
    • [A-Za-z] = 任何大写或小写字母
    • $ = 断言字符串结束

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多