[英]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.