C# 如何转义变量以运行正则表达式?

C# 如何转义变量以运行正则表达式?,c#,regex,escaping,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”实际字符串数据 “a&\b”{'a','&',BELL} “a&\\b”{'a','&','\','b'} @“a&\b”{'a',

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

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()

而不是您的代码使用\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);

但是我认为第一个更好。

如果字符串包含预期的内容,则初始正则表达式将起作用

这是因为a(a除外)中的
\
是转义字符。虽然问题中提到了这一点,但问题中的基本前提是错误的,它与“\b是正则表达式单词”无关,因为所讨论的字符串未用作

Literal->实际字符串数据
“a&\b”{'a','&',BELL}
“a&\\b”{'a','&','\','b'}
@“a&\b”{'a','&','\','b'}
因此,原始字符串不包含“b”,而是-由于原始正则表达式替换不接受而被删除。贝尔毕竟不是一个字母数字字符。即使未删除,也不会显示为“b”字符。。因为是贝尔

虽然在.NET标准库1中没有通用的方法将转义从
“\b”
反向到
“\\b”
/
@“\b”
,但您可能会发现它很有用-然后您可以转到
x=EscapeLikeALiteral(“a&\b”)
,然后
x==“a&\\b”
,并获得所需的“ab”结果,即使使用原始的正则表达式2


1
Regex.Escape
/
Regex.Unescape
方法仅适用于正则表达式模式,而不适用于“将字符串反向转义为文字”的一般任务


2严格来说,原始正则表达式不是字母数字过滤器,因为它还允许空格和破折号。

\b
是ASCII(0x08)字符,而不是字符。现在还不清楚你的确切目标是什么。。。可能
“a&\b”。替换(“\b”,“\\b”)
?字符串x可以包含任何值。这足够安全吗?我是否只执行替换并使用Regex.Escape()?能否编辑您的问题以匹配已接受的答案?您的“预期
ab
”非常令人困惑…我深表歉意。使用Dereks解决方案后,我想我看到了
ab
。我已经解开了答案。这是如何复制“ab”的?在这种情况下,原始正则表达式也会工作得很好-它也有一个稍微不同的“字母数字”的含义。虽然这些都是近似的备选方案,但它们既不能回答问题,也不能解决根本问题。