0

我有这样一段代码:

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

而且我在输出中看不到任何东西,如果源是会有的,我可以看到输出。谁能给我解释一下?

在某种程度上是一个问题。如何创建一个将在 1 或 2 之间找到的正则表达式(这是一个示例,我正在编写某种解析器并且需要创建我自己的以这种方式运行的通配符)单词。我已经尝试了一些组合,但一切都失败了。我的尝试之一:

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

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

4

5 回答 5

1

原因是该代码不匹配。\w可以是任何字母数字字符和下划线(本质上是A通过Z0通过9_)。然而,空间是它们自己的组(由 表示\s)。

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

There [\w\s]+? be

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


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

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

于 2013-01-07T22:50:44.220 回答
0

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

于 2013-01-07T22:50:49.690 回答
0

那是因为空间在\w+. 尝试使用以下任一方法:

@"There \w+ \w+ be"

或者

@"There [\w\s]+ be"
于 2013-01-07T22:51:11.833 回答
0

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

于 2013-01-07T22:51:38.183 回答
0

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

于 2013-01-07T23:10:45.670 回答