忽略正则表达式匹配的空格

时间:2010-07-19 09:43:05

标签: c# .net regex

我需要匹配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,}将无法正常工作,因为我不希望空格占用捕获的字符数。

3 个答案:

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

Omaghosh得到了最接近的答案,但这是最短的正确答案:

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,}

应该有效