Skip to main content
 首页 » 编程设计

c#之组的可选正则表达式匹配不起作用

2024年02月23日25lexus

我有下面这句话

#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 个字符},这可以是可选的。我可以拥有它,或者它可能丢失了,在这种情况下,其余的应该返回 token 。

我的正则表达式有什么问题?

谢谢你的帮助

请您参考如下方法:

这个:

#[a-zA-Z] 

表示 # 后跟一个单个 ASCII 字母。你想要这个:

#[a-zA-Z]{1,2} 

为了允许一个或两个 ASCII 字母。

另外,这个:

(?:...) 

表示一个非捕获组。如果你想让一个标记出现在你的结果中,你需要将它包裹在capturing括号中:

(...) 

所以,把它放在一起:

@"((?:#[a-zA-Z]{1,2})?)(.*)#(\d+)(.*\s)(?:\[(.*)\])?" 

(注意:对我来说,您希望如何处理空格并不明显;您可能需要根据需要稍微调整上面的内容。请特别注意,如果前两个标记之间有空格,则上面的pattern 会将其视为第二个标记的一部分。)