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

时间:2012-03-25 02:34:44

标签: c# regex pattern-matching

我有以下句子

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

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

感谢您的帮助

1 个答案:

答案 0 :(得分:4)

此:

#[a-zA-Z]

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

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

以便允许一个或两个 ASCII字母。

另外,这个:

(?:...)

表示 - 捕获组。如果您希望在结果中显示令牌,则需要将其包装在捕获括号中:

(...)

所以,把它放在一起:

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

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