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

Gre*_*g B 9 .net c# regex

我需要匹配8位或更多位数,其序列可以包含空格.

例如,以下所有内容都是有效的匹配.

12345678
1 2345678
12 3 45678
1234 5678
12 34567 8
1 2 3 4 5 6 7 8
Run Code Online (Sandbox Code Playgroud)

目前我有,\d{8,}但这只会捕获一个8位或更多位的固体块.
[\d\s]{8,}将无法工作,因为我不希望空白空间有助于捕获的字符计数.

Ama*_*osh 13

(\d *){8,}
Run Code Online (Sandbox Code Playgroud)

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

( *\d *){8,}  #there is a space before first asterik
Run Code Online (Sandbox Code Playgroud)

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

(\s*\d\s*){8,}
Run Code Online (Sandbox Code Playgroud)

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

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


Sua*_*ere 7

稍后再说,但这确实需要正确的答案,以及原因。谁知道这个问题会有这么复杂的答案,对吗?大声笑。但是围绕正则表达式的间距有很多注意事项。

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

第二; 记住Freespacing (?x)选项,这使您的正则表达式可注释且可自由分配空间。您不应该担心有人使用该选项会破坏您的正则表达式,因为您决定在其中放置随机的键盘空格。此外,(?x)不会当它是一个字符类中,像这样无视键盘上的空格:[ ]。因此,将字符类用于键盘空间会更安全。

第三; 尽量不要\s在这种情况下使用。正如Omaghosh指出的那样,它还包含换行符(\r\n)。您提到的方案似乎并不那么支持。但是,正如Omaghosh指出的那样,您可能不仅需要键盘空间。所以,你可以使用[ ][\s-[\r\n]][\f\t\v\u00A0\u2028\u2029\u0020]取决于你喜欢什么。这些选项中的最后两个是同一件事,但字符类减法仅在.NET和其他几种怪异的风格中起作用。

第四; 这是一种通常过度构建的模式:(\s*...\s*)*。这没有任何意义。与this (\s*\s*...)*或this 相同(\s*\s*\s*\s*...)*。因为图案是重复的。反对我说的唯一论点是,可以确保您在之前捕获空格...。但是,这是真正想要的一次。最坏的情况是,您可能会看到以下信息:\s*(...\s*)*

奥马霍什(Omaghosh)的答案最接近,但这是最短的正确答案:

Regex.Match(input, @"(?:\d[ ]*){8,}").Groups[0].Value;
Run Code Online (Sandbox Code Playgroud)

或以下问题,如果我们从字面上回答这个问题,即六个选项在同一行的同一行中:

Regex.Match(input, @"(?m)^(?:\d[ ]*){8,}$").Groups[0].Value;
Run Code Online (Sandbox Code Playgroud)

或以下内容(如果它是更大的正则表达式的一部分并且需要一个组):

Regex.Match(input, @"...((?:\d[ ]*){8,})...").Groups[1].Value;
Run Code Online (Sandbox Code Playgroud)

并随时[ ]用.NET类减法或非.NET显式空白类替换:

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