6

\ / または } のいずれかの文字が後に続かない場合、文字列からバックスラッシュを削除する正規表現があります。

この文字列を次のように変換する必要があります。

foo\bar\\batz\/hi

これに:

foobar\\batz\/hi

しかし、問題は、バックスラッシュが進むにつれて、それぞれのバックスラッシュを処理していることです。したがって、最初のバックスラッシュを削除し、別のバックスラッシュが続くため 2 番目のバックスラッシュを無視するという規則に従います。しかし、3 つ目に到達すると、別のものが続かないため、それを削除します。

私の現在のコードは次のようになります。str.replace(/\\(?!\\|\/|\})/g,"")

しかし、結果の文字列は次のようになります。foobar\batz\/hi

3番目のバックスラッシュをスキップするにはどうすればよいですか? それとも、ある種の明示的な否定的な検索と置換タイプのことを行う場合ですか? 例えば。'\' を置換しますが、'\\'、'\/' または '\}' は置換しませんか?

助けてください!:)

編集

申し訳ありませんが、説明する必要がありました-私はjavascriptを使用しているため、否定的な後読みはできないと思います...

4

3 に答える 3

6

エスケープされたバックスラッシュの後に 1 つのバックスラッシュが続くことに注意する必要があります。またはそれ以上: 連続するバックスラッシュの数が奇数です。その場合、偶数のバックスラッシュをそのままにして、最後のバックスラッシュのみを置き換える必要があります (または が続かない場合/) {

次の正規表現を使用してそれを行うことができます。

(?<!\\)(?:((\\\\)*)\\)(?![\\/{])

そしてそれを次のように置き換えます:

$1

ここで、最初の一致グループは、一致した最初の偶数のバックスラッシュです。

簡単な説明:

(?<!\\)          # looking behind, there can't be a '\'
(?:((\\\\)*)\\)  # match an uneven number of backslashes and store the even number in group 1
(?![\\/{])       # looking ahead, there can't be a '\', '/' or '{'

平易な英語では、次のようになります。

奇数のバックスラッシュ , の(?:((\\\\)*)\\)後に\\or{または/,(?![\\/{])がなく、バックスラッシュが前にないもの(?<!\\)一致します。

Java のデモ (バックスラッシュが二重にエスケープされていることに注意してください!):

String s = "baz\\\\\\foo\\bar\\\\batz\\/hi";
System.out.println(s);
System.out.println(s.replaceAll("(?<!\\\\)(?:((\\\\\\\\)*)\\\\)(?![\\\\/{])", "$1"));

印刷されます:

baz\\\foo\bar\\batz\/hi
baz\\foobar\\batz\/hi

編集

また、後読みを必要としないソリューションは次のようになります。

([^\\])((\\\\)*)\\(?![\\/{])

そして、次のものに置き換えられます。

$1$2

ここ$1で、 は開始時のバックスラッシュ以外の文字であり、そのバックスラッシュ$2以外の文字に続く偶数 (またはゼロ) の数のバックスラッシュです。

于 2011-02-22T19:34:18.390 に答える
2

必要な正規表現は次のように単純です。\\.

ただし、 の 2 番目の引数は次replace()のような関数になる可能性があることを知っておく必要があります。

result = string.replace(/\\./g, function (ab) { // ab is the matched portion of the input string
    var b = ab.charAt(1);
    switch (b) { // if char after backslash
    case '\\': case '}': case '/': // ..is one of these
        return ab; // keep original string
    default: // else
        return b; // replace by second char
    }
});
于 2011-02-22T20:15:21.457 に答える
0

You need a lookahead, like you have, and also a lookbehind, to ensure that you dont delete the second slash (which clearly doesnt have a special character after it. Try this:

(?<![\\])[\\](?![\\\/\}]) as your regex

于 2011-02-22T19:08:08.263 に答える