regex - 用于排除以连续前导零开头或仅为字母的字符串的正则表达式
问题描述
我正在寻找一个正则表达式来仅选择以下字符串中下划线之前不以连续零或连续字母开头的字符串。
例如:
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}
我不确定是否错过了任何场景。此外,如何使用消极或积极的环视来实现相同的目标?
解决方案
您可以尝试使用消极的前瞻性组:
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 仅保留有效行(默认行为),未显示的行被视为无效。
推荐阅读
- javascript - 在画布上绘制可拖动对象的重构代码
- processing - 处理:代码停止工作而不对其进行任何更改
- php - Laravel 5:如何重置内置油门/速率限制器?
- c# - Windows 2008 服务器上的 WCF 服务错误
- php - PHP:如何防止用户在登录后单击返回按钮时进入登录页面?
- c++ - 使用 isdigit 和 isalpha 设置 char 数组彼此相等
- android - 检测 Apk 中的代码篡改
- javascript - 在图像悬停Jquery上显示div
- cookies - 为什么即使在完全清理了我的浏览器后,Google cookie 仍会发送到第三方网站?
- c - 如何防止 clang/llvm 将局部变量编译为全局变量?