概括
您可以使用正则表达式匹配多个字符,但用特定替换替换单个字符。
例如,替换\
为\\
、替换"
为\x22
、替换'
为\x27
。
据我了解,这根本不可能,因为您可以在表达式中使用捕获的子匹配,但不能使用任何允许您在发生子匹配时有条件地输出文本的逻辑级别。
以下 VB.NET 代码显然是完全不正确的,但让您了解我的想法......(即,如果有一个替换命令允许您说“如果发生子匹配 1,则\\
改为输出”)
RegEx.Replace(text, "(\)?("")?(')?", "{if($1,'\\')}{if($2,'\x22')}{if($2,'\x27')}")
(这将与 .NET RegEx 类一起使用,但对于与 javascript RegExp 类一起使用会很有用)
背景
更多是出于兴趣而不是实际需要,但我一直在使用编码文本以在 javascript 参数中使用。(嗯,需求肯定存在,但兴趣在于效率。)
我一直在使用标准String.Replace
,并使用以下两个功能对性能进行了一些测试......
Public Function GetJSSafeString(ByVal text As String) As String
Return text.Replace("\", "\\").Replace("""", "\x22").Replace("'", "\x27")
End Function
Public Function GetJSSafeString2(ByVal text As String) As String
If text.Contains("\") Then
text = text.Replace("\", "\\")
End If
If text.Contains("""") Then
text = text.Replace("""", "\x22")
End If
If text.Contains("'") Then
text = text.Replace("'", "\x27")
End If
Return text
End Function
使用两个字符串,长度都约为 200 个字符 - 第一个不包含任何要转换的字符 - 第二个包含每个要转换的字符 ( \"'
)。我通过这两个函数分别运行了这两个字符串 100000 次。
四个结果(以总毫秒为单位)大致为......
GetJSSafeString, no converted characters: 182.0364
GetJSSafeString, converted characters: 316.0632
GetJSSafeString2, no converted characters: 60.012
GetJSSafeString2, converted characters: 354.0708
所以很明显 GetJSSafeString2 如果没有替换是最好的,如果有要转换的字符则最差(但不会更糟,所以看起来是更好的选择)。
但这让我想到......这可以用一个正则表达式来完成吗?
如果是这样,它会比上述两个函数中的任何一个更快吗?