概要
正規表現を使用して複数の文字に一致させることができますが、個々の文字を特定の置換に置き換えることはできますか?
たとえば、 と置き換え\
、\\
と置き換え"
、と\x22
置き換えます。'
\x27
式内でキャプチャされたサブマッチを使用することはできますが、サブマッチが発生した場合に条件付きでテキストを出力できるレベルのロジックでは使用できないため、これは単に不可能であることを理解しています。
次の VB.NET コードは明らかに完全に間違っていますが、私の考えを理解することができます... (つまり、「サブマッチ 1 が発生した場合、\\
代わりに出力する」と言うことができる置換コマンドがあった場合)
RegEx.Replace(text, "(\)?("")?(')?", "{if($1,'\\')}{if($2,'\x22')}{if($2,'\x27')}")
(これは .NET RegEx クラスで使用するためのものですが、javascript RegExp クラスで使用すると便利です)
バックグラウンド
実際の必要性よりも興味がありますが、javascript パラメーター内で使用するテキストのエンコードで遊んでいます。(まあ、必要性は確かにありますが、関心は効率です。)
私は標準を使用しておりString.Replace
、次の2つの機能を使用してパフォーマンスのテストを行っています...
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
2 つの文字列を使用します。どちらも長さが約 200 文字です。最初の文字列には変換対象の文字が含まれていません。2 番目の文字列には、変換対象の各文字が 1 つずつ含まれています ( \"'
)。2 つの文字列のそれぞれに対して、2 つの関数をそれぞれ 100000 回実行しました。
4 つの結果は (合計ミリ秒単位で) おおよそ次のようになります...
GetJSSafeString, no converted characters: 182.0364
GetJSSafeString, converted characters: 316.0632
GetJSSafeString2, no converted characters: 60.012
GetJSSafeString2, converted characters: 354.0708
したがって、置換がない場合は明らかに GetJSSafeString2 が最適であり、変換する文字がある場合は最悪です (ただし、それほど悪くはないため、より良い選択のように見えます)。
しかし、考えさせられました...これは単一の正規表現で行うことができますか?
もしそうなら、上記の2つの関数のどちらよりも高速ですか?