我正在寻找一个正则表达式,以仅选择在以下字符串中的下划线之前不以连续零或连续字母开头的字符串。
例如:
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}
我不确定是否错过了这种情况。另外,如何使用否定或肯定的环视效果实现同一目标?
答案 0 :(得分:0)
您可以尝试使用负面的前瞻性组:
grep -Pi '^(?![a-z]+(?:_|$|\s)|0+(?:_|$|\s))' test.txt
说明:
-Pi
-使用PCRE并处理 i 忽略大小写。这是特定于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仅保留有效行(默认行为),因此未显示的行被视为无效行。
答案 1 :(得分:0)
对于您的示例数据,您可以使用可选的零^0?
进行匹配,因为这可能会出现,但不超过1个零。
^0?[1-9][0-9]*_[A-Z]+-[0-9]{3}$
这将匹配
^0?
在字符串开头的可选零[1-9][0-9]*
匹配一个1-9的数字,然后匹配0+个数字_[A-Z]+
匹配_
,然后匹配1+次A-Z -[0-9]{3} Match
-`后跟3位数字$
声明字符串的结尾