如何转义我的变量来运行我的正则表达式?

时间:2014-05-03 01:51:44

标签: c# regex escaping

我的字符串包含可以被视为正则表达式的内容。

var x = "a&\b";

我正在尝试替换任何非数字或字母字符。

var z = Regex.Replace(x, "[^a-zA-Z0-9 -]", "", RegexOptions.IgnoreCase);

预期结果:ab
实际结果:a

我知道\b是一个正则表达词。

我也理解我可以var x = @"a&\b";,但是,我希望逃避变量,而不是转让。

如何转义变量x

我试过了Regex.Escape()

2 个答案:

答案 0 :(得分:1)

初始正则表达式工作 - 如果字符串包含预期的内容。

这是因为String Literal中的\Verbatim String Literal除外)是转义字符。虽然问题中提到了这一点,但问题中的基本前提是错误的并且没有与“\ b是正则表达式单词”有关,因为字符串在问题是用作regular expression pattern

Literal  ->  actual String data
"a&\b"       {'a', '&', BELL}
"a&\\b"      {'a', '&', '\', 'b'}
@"a&\b"      {'a', '&', '\', 'b'}

因此,它是包含'b'的原始字符串 - 而是BELL character - 由于未被接受而被删除通过原始正则表达式替换。毕竟,BELL不是字母数字字符。即使它没有删除,它也不会显示为'b'字符..因为它是BELL。

虽然.NET标准库 1 中有 no 通用方法,但是从"\b"反向转义为"\\b" / {{1 }},你可能会发现this transformation function很有用 - 然后你可以@"\b",然后x = EscapeLikeALiteral("a&\b"),并获得所需的“ab”结果,即使原始正则表达式 2


1 x == "a&\\b" / Regex.Escape方法仅 适合与正则表达式模式一起使用,而不是“将字符串反向转义为文字”的广义任务。

2 严格来说,原始正则表达式不是一个字母数字过滤器,因为它还允许使用空格和短划线。

答案 1 :(得分:0)

而不是你的代码如何使用\ W?

\ w匹配任何单词字符[a-zA-Z_0-9]

\ W匹配任何非单词字符[^ a-zA-Z_0-9]

所以我建议你使用:

var z = Regex.Replace(x, "\W", "", RegexOptions.IgnoreCase);

您可以使用:

var z = Regex.Replace(x, "[^a-zA-Z_0-9]", "", RegexOptions.IgnoreCase);

但我认为第一个更好。