2

概要

正規表現を使用して複数の文字に一致させることができますが、個々の文字を特定の置換に置き換えることはできますか?

たとえば、 と置き換え\\\と置き換え"、と\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つの関数のどちらよりも高速ですか?

4

2 に答える 2

2

JavaScript での解決策:

var text="this is a test \\ with \"things\" to ' replace";
var h={'\\':'\\\\', '"':"\\x22", "'":"\\x27"}; //we define here the replacements
text=text.replace(/("|\\|')/g,function(match){return h[match]});
alert(text); //prints: this is a test \\ with \x22things\x22 to \x27 replace
于 2013-10-03T10:36:44.137 に答える