我有下面这句话
#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 会将其视为第二个标记的一部分。)
关于c# - 组的可选正则表达式匹配不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9857479/