我的字符串包含可以被视为正则表达式的内容。
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()
答案 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);
但我认为第一个更好。