我有以下句子
#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个字符},这可以是可选的。我可以拥有它,或者它可能会丢失,在这种情况下其余部分应该返回令牌。
我的正则表达式出了什么问题?
感谢您的帮助
答案 0 :(得分:4)
此:
#[a-zA-Z]
表示#
后跟单个 ASCII字母。你想要这个:
#[a-zA-Z]{1,2}
以便允许一个或两个 ASCII字母。
另外,这个:
(?:...)
表示非 - 捕获组。如果您希望在结果中显示令牌,则需要将其包装在捕获括号中:
(...)
所以,把它放在一起:
@"((?:#[a-zA-Z]{1,2})?)(.*)#(\d+)(.*\s)(?:\[(.*)\])?"
(注意:对我来说,如何处理空格并不是很明显;你可能需要根据需要调整上面的内容。特别注意,如果前两个令牌之间有空格,则上面pattern会将其视为第二个令牌的一部分。)