正则表达式:为所有结果将量词添加到捕获组

时间:2019-06-10 19:46:46

标签: c# regex

我有以下有效的字符串...

 "   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个字符?

3 个答案:

答案 0 :(得分:4)

如果匹配不能以零开头,则可以按照Wiktor先前的评论添加负前瞻:

"(?="|.{4}")(?! *0)[0-9A-Z -]*"

说明

  • "字面上匹配
  • (?="|.{4}")如果在右边直接是“或4个字符,后跟”
  • (?! *0)如果右边直接不是0+空格后跟零
  • [0-9A-Z -]*匹配0+次字符类中列出的内容
  • "字面上匹配

Regex demo

如果空格只能出现在开头,则可以使用:

"(?="|.{4}")(?! *0) *[0-9A-Z-]+"

Regex demo

答案 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