组的可选正则表达式匹配;不起作用

本文关键字:不起作用 正则表达式 | 更新日期: 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)(?:'[(.*)'])?"

(注意:我不清楚你希望如何处理空白;你可能需要根据自己的需要对上面的内容进行一点调整。特别注意,如果前两个标记之间有空白,上面的模式会将其视为第二个标记的一部分。)