4

注:正規表現を使用してHTMLを解析しようとはしていません

文字列内の$記号($など$)でラップされたコンテンツを置き換えようとしています。なんとか思いついたstr.replace(/\$([^\$]*)\$/g), "hello $1!")のですが、HTMLタグでラップされているときにそのような文字列を置き換えないようにするのに問題があります。

文字列の例:$someone$, <a>$welcome$</a>, and $another$

表現:/[^>]\$([^\$]*)\$[^<]/g

期待される出力:hello someone!, <a>$welcome</a>, and hello another!

実際の出力:$someonhello , !elcomhello , and !nother$

テストコード:alert("$someone$, <a>$welcome$</a>, and $another$".replace(/[^>]\$([^\$]*)\$[^<]/g, "hello $1!"));

フィドル: http: //jsfiddle.net/WMWHZ/

ありがとう!

4

1 に答える 1

4

テストケースには6つの「$」があることに注意してください。ここでの問題は、前の文字が「>」でないかどうかを確認しようとすると、正規表現が前方に移動し、4番目5番目のドル記号の間にあるものと一致して、キャプチャ"</a>, and "して混乱させることです。

これを試してください:

$('div').text(test.replace(/(^|[^>])\$([^<][^\$]*)\$(?!<)/g, "$1hello $2!"))​

Javascriptは、正規表現での先読みをサポートしていませんが、先読み((?!<)一部)はサポートしています。後読みをエミュレートする[^>]には、ドルの前に正しく配置しようとしましたが、文字が一致するため、それをキャッチして文字列に再度配置する必要があります。

'$'が文字列の先頭にある場合、グループはキャプチャされないため、少し調整する必要があります。

また、上記のような問題を回避するために、最初のドルのに「<」がないかどうかを確認する必要があるため[^<]、キャプチャグループの先頭にaを付けます。これは、ドル記号の間の空の文字列('$$'のように)をキャッチしないことも意味します。少なくとも1つの文字が含まれている必要があります。

このようにして、期待どおりの結果が得られます。

于 2012-05-24T15:01:59.957 に答える