C# 组的可选正则表达式匹配不';行不通

C# 组的可选正则表达式匹配不';行不通,c#,regex,pattern-matching,C#,Regex,Pattern Matching,我有下面的句子 #bb John can #20 jiang stone [voila] 我想让我的C#regex为我的团队提供5场比赛 #bb John Can 20 jiang stone voila 其中#bb和voila位置的代币是可选的 我使用了下面的正则表达式,它在没有第一个#bb-for的句子中很好地工作 John can #20 jiang stone [voila] 给我4个带表达式的正确标记 @"(.*)#(\d+)(.*\s)(?:\[(.*)\])?" 然而,当我

我有下面的句子

#bb John can #20 jiang stone [voila]
我想让我的C#regex为我的团队提供5场比赛

#bb
John Can
20
jiang stone
voila
其中#bb和voila位置的代币是可选的

我使用了下面的正则表达式,它在没有第一个#bb-for的句子中很好地工作

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)(?:\[(.*)\])?"
(注意:我不清楚您希望如何处理空白;您可能需要根据需要对上面的内容进行一些调整。特别要注意的是,如果前两个标记之间存在空白,则上面的模式会将其视为第二个标记的一部分。)

#[a-zA-Z]
表示后跟单个ASCII字母的
#
。你想要这个:

#[a-zA-Z]{1,2}
以允许使用一个或两个ASCII字母

此外,这:

(?:...)
指非捕获组。如果要在结果中显示标记,则需要将其括在括号中:

(...)
所以,把它放在一起:

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

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

完美!你似乎是雷克斯家族中的神,好先生。我正在学习,在路上挣扎。我似乎反应太快了——需要更多的帮助。当我在最后一节中使用超过一个单词时,即如果我说[voila there]而不是[voila],那么最后一个标记就断了……你知道我应该做些什么来捕获完整的句子吗?@jeremy:尝试的一种可能性是将
(.*\s)
更改为
(.*\s)
*?
表示法类似于
*
表示法,但是
*
表示法是“贪婪的”――它希望尽可能多地匹配,并且只有在必要时才会回溯--
*?
表示法是“不情愿的”――它希望尽可能少地匹配。或者,如果您知道“蒋石”令牌永远不会包含
[
,您可以将
(.*\s)
更改为
([^\[]*\s)
,这样它就不会吞下
[
。是的,这就解决了它(我使用了[^[]*\s)!非常感谢。当然,我现在需要坐下来学习它是如何工作的等等。太好了!你似乎是一个雷格尔斯中的神,好先生。我正在学习它,在路上挣扎。我似乎反应太快了——需要更多的帮助。当我在最后一节中使用超过一个单词时-即,如果我说[voila there],那么就用[voila]代替[voila]最后一个记号断了……你知道我应该怎么做才能抓住完整的句子吗?@jeremy:一种尝试的可能性是将
(.*\s)
改为
(.*\s)
*?
符号类似于
*
符号,但是
*
符号是“贪婪的”--它希望尽可能多地匹配,并且只有在必要时才会回溯--
*?
符号是“不情愿的”--它希望尽可能少地匹配。或者,如果您知道“jiang stone”标记永远不会包含
[
,您可以将
(.*\s)
更改为
([^\[]*\s)
这样它就不会吞下
[
。是的,这就解决了它(我用过([^[]*\s)!非常感谢。当然我现在需要坐下来学习它是如何工作的等等。