这个问题已经在这里有一个答案:
我要寻找一个正则表达式来仅选择不连续的零或连续的字母开始强调在以下字符串之前的字符串。
对于例如:
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}
我不知道但如果任何情形与此无缘。此外,如何能同样的事情可以用消极或积极的环视实现?
为了您的examople数据,你可能匹配使用可选的零^0?
为可能发生的,但不超过1为零。
^0?[1-9][0-9]*_[A-Z]+-[0-9]{3}$
这将匹配
^0?
可选零[1-9][0-9]*
匹配之后0+数字一个数字1-9_[A-Z]+
匹配一个_
接着1+倍A-Z-[0-9]{3} Match
-`后跟3个数字$
断言字符串的结尾你可以用负前瞻组尝试:
grep -Pi '^(?![a-z]+(?:_|$|\s)|0+(?:_|$|\s))' test.txt
说明:
-Pi
- 使用PCRE和过程忽略大小写。这是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的只保留有效行(默认行为),非显示线被处理为无效。