繁体   English   中英

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

[英]Ignoring white space for a Regex match

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

(\d *){8,}

它匹配八个或更多个数字后跟零个或多个空格。 将其更改为

( *\d *){8,}  #there is a space before first asterik

在开头匹配字符串与空格。 要么

(\s*\d\s*){8,}

匹配制表符和其他空格字符(也包括换行符)。

最后,使用?:将其设为非捕获组。 因此它变成了(?:\\s*\\d\\s*){8,}

Waayy后来,但这确实需要正确的答案,这是一个原因。 谁知道这个问题会有这么复杂的答案,对吧? 大声笑。 但是在正则表达式中有很多关于间距的考虑因素。

首先; 永远不要在正则表达式中放置空格。 这样做会使你的正则表达不可读,并且不可维护。 记住使用鼠标突出显示空间以确保它只有一个空间的记忆。 这会破坏你的正则表达式:但是这不会:[],因为忽略了字符类中的重复。 如果你需要确切数量的空格,你可以在类似的字符类中看到它: [ ]{3} 与没有角色类的事故一样:{3} < - 这实际上是寻找5个空间,woops!

第二; 记住Freespacing (?x)选项,这使得你的正则表达式可以评论和自由空间。 您不应该担心使用该选项的人可能会破坏您的正则表达式,因为您决定在其中放置随机键盘空间。 此外, (?x)当它在如下所示的字符类中时不会忽略键盘空间: [ ] 因此,为键盘空间使用字符类更安全。

第三; 尽量不要在这种情况下使用\\s 正如Omaghosh指出的那样,它还包括换行符( \\r\\n )。 你提到的场景似乎不太喜欢。 然而,正如Omaghosh指出的那样,你可能想要的不仅仅是键盘空间。 因此,您可以使用[ ][\\s-[\\r\\n]][\\f\\t\\v\ \
\
\ ]具体取决于您的喜好。 这些选项中的最后两个是相同的,但字符类减法只适用于.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类减法或非.NET显式空白类替换[ ]

@"(?:\d[\s-[\r\n]]*){8,}"
// Or . . .
@"(?:\d[\f\t\v\u00A0\u2028\u2029\u0020]*){8,}"
(\d{8,}\s+)*\d{8,}

应该管用

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM