我有以下有效的字符串...
" 1"
" 12"
" 123"
"1234"
" 123"
" 12A"
""
以下字符串无效...
" 1234"
" 1234"
"0 12"
"0012"
当前,我使用以下正则表达式匹配项来检查字符串是否有效...
"(|[0-9A-Z\-]{4}| {1}[0-9A-Z\-]{3}| {2}[0-9A-Z\-]{2}| {3}[0-9A-Z\-]{1})"
注意:显然,上面的正则表达式不能满足我的要求,这就是为什么我问这个问题。
我希望可以使用更简单的匹配项,例如以下内容...
"(| {0,3}[0-9A-Z\-]{1,4})"
我唯一的问题是以上内容也将与" 1234"
这样匹配,这是不可接受的。有什么办法可以将捕获组限制为只有4个字符?
答案 0 :(得分:4)
如果匹配不能以零开头,则可以按照Wiktor先前的评论添加负前瞻:
"(?="|.{4}")(?! *0)[0-9A-Z -]*"
说明
"
字面上匹配(?="|.{4}")
如果在右边直接是“或4个字符,后跟” (?! *0)
如果右边直接不是0+空格后跟零[0-9A-Z -]*
匹配0+次字符类中列出的内容"
字面上匹配如果空格只能出现在开头,则可以使用:
"(?="|.{4}")(?! *0) *[0-9A-Z-]+"
答案 1 :(得分:2)
这将通过您的所有测试用例:
"(|[1-9\s][0-9A-Z\s]{2}[0-9A-Z])"
尽管我怀疑有些情况您可能没有提到。
说明:双引号之间匹配0或4个字符。第一个字符可以是空格或数字,但不能为零。接下来的两个字符是任何数字或大写字母或空格。第四个字符是数字或大写字母,而不是空格。
答案 2 :(得分:1)
使其更加有效:
"(?:[A-Z\d-]{4}|[ ](?:[A-Z\d-]{3}|[ ](?:[A-Z\d-]|[ ])[A-Z\d-]))"
https://regex101.com/r/1fr9tb/1
"
(?:
[A-Z\d-]{4}
| [ ]
(?:
[A-Z\d-]{3}
| [ ]
(?: [A-Z\d-] | [ ] )
[A-Z\d-]
)
)
"
基准
Regex1: "(?:[A-Z\d-]{4}|[ ](?:[A-Z\d-]{3}|[ ](?:[A-Z\d-]|[ ])[A-Z\d-]))"
Options: < none >
Completed iterations: 50 / 50 ( x 1000 )
Matches found per iteration: 7
Elapsed Time: 0.66 s, 663.84 ms, 663843 µs
Matches per sec: 527,233
Regex2: "(|[0-9A-Z\-]{4}|[ ]{1}[0-9A-Z\-]{3}|[ ]{2}[0-9A-Z\-]{2}|[ ]{3}[0-9A-Z\-]{1})"
Options: < none >
Completed iterations: 50 / 50 ( x 1000 )
Matches found per iteration: 7
Elapsed Time: 0.94 s, 938.44 ms, 938438 µs
Matches per sec: 372,960
Regex3: "(?="|.{4}")(?![ ]*0)[0-9A-Z -]*"
Options: < none >
Completed iterations: 50 / 50 ( x 1000 )
Matches found per iteration: 6
Elapsed Time: 0.73 s, 728.48 ms, 728484 µs
Matches per sec: 411,814
Regex4: "(|[1-9\s][0-9A-Z\s]{2}[0-9A-Z])"
Options: < none >
Completed iterations: 50 / 50 ( x 1000 )
Matches found per iteration: 6
Elapsed Time: 0.85 s, 851.48 ms, 851481 µs
Matches per sec: 352,327