逃脱关闭支撑

时间:2011-11-23 10:58:40

标签: c# regex

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

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

2 个答案:

答案 0 :(得分:5)

如上面的评论所述,Escape功能的行为如下(MSDN):

  

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

添加以下注释:

  

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

因此,如果口译员发现}前面没有开头{,它将自动逃脱它。

答案 1 :(得分:1)

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

FWIW,测试Regex.Escape()会得到以下结果:

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

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