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”的?在这种情况下,原始正则表达式也会工作得很好-它也有一个稍微不同的“字母数字”的含义。虽然这些都是近似的备选方案,但它们既不能回答问题,也不能解决根本问题。