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。你知道如何修理它或用另一种方法制作吗?
这样做的原因是这段代码不匹配。'w
可以是任何字母数字字符和下划线(所以本质上是A
到Z
, 0
到9
和_
)。空格有自己的组(由'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"
。