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

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

相关文章:

c# - 有一个循环来创建结构

c# - 是否可以对有效的 mp3 字节数据进行单元测试?

javascript - 为什么使用正则表达式密码验证失败?

python - 关键词匹配和关键词计数

regex - Scala 与 Java 正则表达式匹配 : Big performance difference: Why?

c# - 如何显示文件中的 PNG?

c# - 如何使用 C# 将数据插入到 excel 表中?

erlang - 为什么在这个函数中使用了 "when"?

c++ - tr/regex c++ 库 - 正则表达式模式的定义

regex - 使用 grep 计算包含子字符串的单词数