带有+,*的C#正则表达式*似乎无法正常工作

时间:2013-01-07 22:47:49

标签: c# regex

我有这样一段代码:

String source = "There will will be";
Regex r = new Regex(@"There \w+ be");
Console.WriteLine(r.Match(source).Value);

我在输出中看不到任何东西,如果源是有的话,我可以看到输出。有人能解释一下吗?

在某种程度上是一个问题。如何创建一个可以在1或2之间找到的正则表达式(这是一个例子,我正在编写某种解析器,需要创建我自己的那种行为的wildchar)单词。我已经尝试过几种组合,但一切都失败了。 我的一次尝试:

@"\w+\s{1,2}"

我认为这是错误的,因为{1,2}告诉regexp重复空格1或2次,而不是整个\ w + \ s。你知道如何解决它或以不同的方式制作吗?

5 个答案:

答案 0 :(得分:1)

原因是这段代码不匹配。 \w可以是任何字母数字字符和下划线(基本上是AZ09_)。然而,空格是他们自己的组(由\s表示)。

要解决此问题,您可以通过创建一个匹配算法可以使用[]选择任何元素的组来使正则表达式匹配:

There [\w\s]+? be

请注意,我还添加了?以使其成为非贪婪的匹配,尝试匹配文本中尽可能少的部分(否则您可以在匹配时跳过be)。


至于添加,只需使用不匹配的组(与匹配组相比节省一些处理时间和内存):

(?:\w+\s){1,2}

答案 1 :(得分:0)

\w匹配任何单词字符(a-zA-Z0-9和下划线)。 There will will be需要\w+才能匹配will will\w无法匹配空格,因此正则表达式不匹配。

答案 2 :(得分:0)

那是因为\w+内的空格不匹配。请尝试使用以下任一方法:

@"There \w+ \w+ be"

@"There [\w\s]+ be"

答案 3 :(得分:0)

\w匹配所有字母数字字符和下划线。在您的示例中,它必须匹配包含空格的will will,因此不匹配。但是,您的表达式只会与There will be匹配will

答案 4 :(得分:0)

\ w匹配单词字符,因此两个'will'字符串之间的空格会阻止匹配。您可能希望将其替换为@"There \w+(?:\s+\w+)* be"