2011-11-23 107 views
5

System.Text.RegularExpressions.Regex.Escape()只能脱开大括号。是否有一个.NET Framework方法逃避了在正则表达式中使用大括号?我似乎无法找到任何。我讨厌硬编码字符。逃脱关闭大括号

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

+2

MSDN说:“如果右括号或大括号没有对应的开头字符,则正则表达式引擎会直接解释它”。你确定你需要逃避闭合括号吗? –

+0

@TimBourguignon:我想你也可以把这个作为答案。 –

回答

1

当我尝试它时,Regex.Escape确实会逃脱。你的代码中还有其他的东西吗?发布一个可重复使用的转义代码和正则表达式的例子会很有帮助。我认为蒂姆的评论可能也是关于发生了什么的标志。

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

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

编辑:从我明白你的意思的意见确定{现在,并与测试给你说的结果。 Regex.Escape()试图在需要时才转义,但如果这不是你想要的,那么没有任何其他内置方法可以工作。我认为你必须1)添加它自己丢失的内容,或者2)如果可能的话,以不同的方式格式化你的输入字符串,这样Regex.Escape将按预期工作。

+0

有趣的事情。当我尝试同样的事情时,第二个结果是“你好)”。嗯。奇怪的。 – dijxtra

+0

这些是括号(又名圆括号);用方括号或花括号来试试它(人们通常用我的经验中的“大括号”来表示),而且你会发现它只能逃脱开场之一。 –

+0

哦,双重检查,是的,我在我的例子中使用方括号。 – dijxtra

4

如在评论说以上,退出函数的行为如下(MSDN):

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

以下备注添加:

虽然退出方法逸出的直开口括号([)和开口括号({)字符,它不会逃脱其相应的闭合字符(]和} )。在大多数情况下,逃避这些是没有必要的。 如果右括号或大括号没有对应的开头字符,则正则表达式引擎会按字面解释。如果开头的大括号或大括号被解释为元字符,则正则表达式引擎将第一个对应的结尾字符解释为元字符。如果这不是所需的行为,则应通过显式预置反斜杠()字符来隐藏结束括号或大括号。有关说明,请参阅示例部分。

因此,如果解释器发现不被开口{它将自动地逃脱它前面一个}

+0

我知道这一点。但是,这不是我所问的:-)无论如何,谢谢你的回答,这是努力的成果。 – dijxtra

+0

感谢您的支持。我发现最好的东西就是用你自己的EscapeExtended()函数来扩展Regex类来照顾那些额外的字符;但这几乎是你不想做的硬编码。 –

+0

是的,我已经写了一个私人的静态方法来做到这一点,不需要将它添加到正则表达式类。所以现在我正在寻找更优雅的解决方案...... – dijxtra