首页 > 解决方案 > 用于排除以连续前导零开头或仅为字母的字符串的正则表达式

问题描述

我正在寻找一个正则表达式来仅选择以下字符串中下划线之前不以连续零或连续字母开头的字符串。

例如:

ABC_DE-001 is invalid
abc is invalid (only alphabets)
0_DE-001 is invalid (1 zero before underscore)
000_DE-001 is invalid (sequence of 3 consecutive zeroes)
00_DE-001 is invalid (sequence of 2 consecutive zeroes)
01_DE-001 is valid (0 followed by some other number is valid)
10_DE-001 is valid (starts with 1)
100_DE-001 is valid (starts with 1)

我尝试的一种方法是: (0[1-9]+|[1-9][0-9]+|0[0*$][1-9])_[A-Z0-9]+ [-][0-9]{3}

我不确定是否错过了任何场景。此外,如何使用消极或积极的环视来实现相同的目标?

标签: regex

解决方案


您可以尝试使用消极的前瞻性组:

grep -Pi '^(?![a-z]+(?:_|$|\s)|0+(?:_|$|\s))' test.txt

解释:

  • -Pi- 使用P CRE并处理忽略大小写。这是 grep 特定的,您可以根据您的情况调整这些选项。如果您不能使正则表达式处理器忽略大小写,只需替换[a-z][a-zA-Z]. 当然,还需要 PCRE 支持。
  • ^- 行首
  • (?!rgx)- 向前看而不移动光标来检查该行是否与包含的正则表达式不匹配rgx
  • [a-z]+(?:_|$|\s)|0+(?:_|$|\s)
    • 不要保留连续[a-z]+的字母 ( ) 后跟下划线、行尾或空白字符 ( (?:_|$|\s))
    • 不要保留连续0+的零 ( ) 后跟下划线、行尾或空白字符 ( (?:_|$|\s))
    • (?:)代表非捕获组(获取的内容不存储,如果有,则使用它来提高性能)

输出得到:

01_DE-001 is valid (0 followed by some other number is valid)
10_DE-001 is valid (starts with 1)
100_DE-001 is valid (starts with 1)

由于 grep 仅保留有效行(默认行为),未显示的行被视为无效。


推荐阅读