c# regexp w with +, *似乎不能正常工作

本文关键字:常工作 不能 工作 regexp with | 更新日期: 2023-09-27 17:51:05

我有这样一段代码:

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

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

在某种程度上是一个问题。如何创建一个Regex,将发现1或2之间(这是一个例子,我正在编写某种解析器,需要创建我自己的通配符行为的方式)的单词。我已经试过几种组合,但都失败了。我的一个尝试:

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

我认为这是错误的,因为{1,2}告诉regexp重复空格1或2次,而不是整个'w+'s。你知道如何修理它或用另一种方法制作吗?

c# regexp w with +, *似乎不能正常工作

这样做的原因是这段代码不匹配。'w可以是任何字母数字字符和下划线(所以本质上是AZ, 09_)。空格有自己的组(由's表示)。

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

There ['w's]+? be

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


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

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

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

这是因为'w+内的空间不匹配。尝试使用以下任意一种:

@"There 'w+ 'w+ be"

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

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

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