逃脱关闭支撑

System.Text.RegularExpressions.Regex.Escape()仅转义打开大括号。 是否有一个.NET Framework方法逃避关闭括号在正则表达式中的使用? 我似乎找不到任何东西。 我讨厌对这些角色进行硬编码。

编辑 :我需要生成“(?)”标签来平衡组定义。 我收到一个代表结束分隔符的字符列表,将它们转义,然后将它们添加到“(?)”标签中的表达式中。 所以,是的,我真的不得不逃避关闭括号。

如上面的评论中所述,Escape函数的行为如下( MSDN ):

通过用它们的转义码替换它们来转义一组最小字符(\,*,+,?,|,{,[,(,),^,$,。,#和空格)。 这指示正则表达式引擎按字面解释这些字符而不是元字符。

添加以下注释:

当Escape方法转义直开括号([)和左括号({)字符时,它不会转义它们对应的结束字符(]和})。 在大多数情况下,逃避这些并非必要。 如果右括号或括号前面没有相应的开头字符,则正则表达式引擎会按字面解释它 。 如果将开头的braket或大括号解释为元字符,则正则表达式引擎将第一个对应的结束字符解释为元字符。 如果这不是所需的行为,则应通过显式添加反斜杠()字符来转义右括号或括号。 有关说明,请参阅“示例”部分。

因此,如果解释器发现一个没有开头的{ ,它将自动逃脱它。

当我尝试时,Regex.Escape确实逃脱了。 您的代码中还有其他内容吗? 发布转义代码和正则表达式的可重现示例将会很有帮助。 我认为蒂姆的评论可能也与正在发生的事情有关。

FWIW,测试Regex.Escape()给出了以下结果:

 Regex.Escape("(Hello)"); // \(Hello\) Regex.Escape("Hello)"); // Hello\) Regex.Escape("(Hello"); // \(Hello 

编辑:好的,从我理解你的意思{我现在,并用它测试给出你所说的结果。 Regex.Escape()试图通过仅在必要时进行转义来提供帮助,但如果这不是您想要的,那么没有任何其他内置方法可行。 我认为你必须1)添加自己丢失的转义,或2)如果可能的话,以不同的方式格式化输入字符串,以便Regex.Escape按预期工作。