Skip to main content
 首页 » 编程设计

c#之带有可选部分的正则表达式不会创建反向引用

2024年01月25日29zhwl

我想匹配一行文本末尾的可选标签。

示例输入文本:

The quick brown fox jumps over the lazy dog {tag} 

我想匹配花括号中的部分并创建对它的反向引用。

我的正则表达式是这样的:

^.*(\{\w+\})? 

(有点简化,我也在标签之前匹配部分):

它匹配行 ok(有和没有标签)但不创建对标签的反向引用。

如果我删除 '?'字符,所以正则表达式是:

^.*(\{\w+\}) 

它创建了对标签的反向引用,但随后不匹配没有标签的行。

我从http://www.regular-expressions.info/refadv.html了解到可选运算符不会影响反向引用:

Round brackets group the regex between them. They capture the text matched by the regex inside them that can be reused in a backreference, and they allow you to apply regex operators to the entire grouped regex.

但一定是误会了什么。

如何使标记部分成为可选的并在它存在时创建反向引用?

请您参考如下方法:

这不是反向引用问题,问题是仅通过读取匹配 .* 的文本就满足了正则表达式。它并不觉得有必要继续阅读以阅读可选的结束标记。如果您真正阅读到行尾,最简单的解决方案是附加 $(美元符号)以强制正则表达式匹配整行。

编辑

顺便说一句,我没有按字面意思理解你的正则表达式,因为你说它匹配其他东西,但要清楚 .* 会消耗整行。您需要像 [^{]* 这样的东西来防止标签被吞噬。我猜这对您来说不是问题。