【问题标题】:Regex to match X digits or letters but not X letters in a row正则表达式匹配 X 位数字或字母,但不匹配 X 行中的字母
【发布时间】:2019-08-21 06:09:36
【问题描述】:

我想提取 7 个字符的匹配项。每个字符可以是数字或大写字母,但整个匹配不能只有大写字母。示例:假设我有一个像这样的测试字符串:

I want this nr A7A3G1A but not this ANTENNA

所以我应该得到A7A3G1A,而不是ANTENNA。匹配两者的正则表达式是:[A-Z0-9]{7}。是否有可能以某种方式不允许只允许大写字母并仍然提取第一个匹配项?

【问题讨论】:

  • 只能是1234567这样的数字吗?
  • @Toto 不行,还要有字母

标签: regex language-agnostic regex-negation


【解决方案1】:

你可以使用这个正则表达式,

\b(?![A-Z]{7})[A-Z0-9]{7}\b

Demo

在这里,单词边界\b 确保仅匹配整个单词,(?![A-Z]{7}) 否定前瞻确保匹配的不是全部大写字母,[A-Z0-9]{7} 捕获包含混合大写字母的七个字符的单词和数字。

【讨论】:

    【解决方案2】:

    另一种选择是使用正向预测 (?=,然后确保至少匹配 1 个数字。

    使用单词边界\b 防止匹配成为更大单词的一部分。

    \b(?=[A-Z0-9]{7}\b)[A-Z0-9]+[0-9][A-Z0-9]*
    

    Regex demo

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-09
      • 2011-04-06
      • 1970-01-01
      • 2011-08-29
      相关资源
      最近更新 更多