组的可选正则表达式匹配;不起作用
本文关键字:不起作用 正则表达式 | 更新日期: 2023-09-27 18:29:05
我有以下句子
#bb John can #20 jiang stone [voila]
我想我的C#正则表达式给我5个匹配我的组
#bb
John Can
20
jiang stone
voila
其中#bb和voila位置的代币是可选的。
我使用了下面的正则表达式,它在没有第一个#bb的句子中很好地工作,例如
John can #20 jiang stone [voila]
给我4个正确的令牌,表达式为
@"(.*)#('d+)(.*'s)(?:'[(.*)'])?"
然而,当我用扩展这一点时
@"(?:#[a-zA-Z])?(.*)#('d+)(.*'s)(?:'[(.*)'])?"
它不起作用。句子开头的#bb不是作为单独的标记匹配的,而是作为匹配的
b John Can
我尝试了几种变体,但没有一种能让我与第一个#匹配。。火柴我想要的是,这可以是#{1或2个字符},并且这可以是可选的。我可以拥有它,或者它可能丢失了,在这种情况下,其余的应该返回令牌。
我的正则表达式出了什么问题?
感谢您的帮助
这:
#[a-zA-Z]
表示一个#
,后跟一个单个ASCII字母。你想要这个:
#[a-zA-Z]{1,2}
以便允许一个或两个ASCII字母。
此外,这个:
(?:...)
表示非捕获组。如果你想让一个代币出现在你的结果中,你需要用捕获括号来包装它:
(...)
所以,把它放在一起:
@"((?:#[a-zA-Z]{1,2})?)(.*)#('d+)(.*'s)(?:'[(.*)'])?"
(注意:我不清楚你希望如何处理空白;你可能需要根据自己的需要对上面的内容进行一点调整。特别注意,如果前两个标记之间有空白,上面的模式会将其视为第二个标记的一部分。)