我需要匹配8位或更多位数,其序列可以包含空格。
例如,以下所有内容都是有效的匹配。12345678
1 2345678
12 3 45678
1234 5678
12 34567 8
1 2 3 4 5 6 7 8
目前我有\d{8,}
,但这只会捕获一个8位或更多位的实体块
[\d\s]{8,}
将无法正常工作,因为我不希望空格占用捕获的字符数。
答案 0 :(得分:13)
(\d *){8,}
匹配八个或更多个数字后跟零个或多个空格。将其更改为
( *\d *){8,} #there is a space before first asterik
在开头匹配带空格的字符串。或者
(\s*\d\s*){8,}
匹配制表符和其他空白字符(也包括换行符)。
最后,将其设为?:
的非捕获组。因此它变为(?:\s*\d\s*){8,}
答案 1 :(得分:6)
Waayy后来,但这确实需要正确的答案,这也是一个原因。谁知道这个问题会有这么复杂的答案,对吧?大声笑。但是在正则表达式中有很多关于间距的考虑因素。
首先;永远不要在正则表达式中放置空格。这样做会使你的正则表达不可读,并且不可维护。记住使用鼠标突出显示空间以确保它只有一个空间的记忆。这会破坏你的正则表达式:但是这不会:[],因为忽略了字符类中的重复。如果您需要确切数量的空格,您实际上可以在类似的字符类中看到它:[ ]{3}
。与没有角色类的事故一样:{3}< - 这实际上是寻找5个空间,woops!
二;请记住Freespacing (?x)
选项,这使您的正则表达式可评论且可自由空间。您不应该担心使用该选项的人可能会破坏您的正则表达式,因为您决定在其中放置随机键盘空间。此外,(?x)
不会忽略键盘空间,因为它位于字符类中,如下所示:[ ]
。因此,为键盘空间使用字符类会更安全。
第三;尽量不要在此方案中使用\s
。正如Omaghosh指出的那样,它还包括换行符(\r
和\n
)。你提到的场景似乎不太喜欢。然而,正如Omaghosh指出的那样,你可能想要的不仅仅是键盘空间。因此,您可以使用[ ]
,[\s-[\r\n]]
或[\f\t\v\u00A0\u2028\u2029\u0020]
,具体取决于您的喜好。这些选项中的最后两个是相同的,但字符类减法只适用于.NET和其他一些奇怪的风格。
第四;这是一种通常过度构建的模式:(\s*...\s*)*
。它没有任何意义。它与此相同:(\s*\s*...)*
或此:(\s*\s*\s*\s*...)*
。因为模式是重复的。反对我所说的唯一论据是,你可以保证在...
之前捕获空格。但不是一次真正想要的。在最坏情况下,您可能会看到:\s*(...\s*)*
Regex.Match(input, @"(?:\d[ ]*){8,}").Groups[0].Value;
或者下面,如果我们从字面上理解六个选项在多行的同一文本中:
Regex.Match(input, @"(?m)^(?:\d[ ]*){8,}$").Groups[0].Value;
或者以下,如果它是更大的正则表达式的一部分并且需要一个组:
Regex.Match(input, @"...((?:\d[ ]*){8,})...").Groups[1].Value;
随意用.NET Class Subtraction或非.NET显式空白类替换[ ]
:
@"(?:\d[\s-[\r\n]]*){8,}"
// Or . . .
@"(?:\d[\f\t\v\u00A0\u2028\u2029\u0020]*){8,}"
答案 2 :(得分:-1)
(\d{8,}\s+)*\d{8,}
应该有效