0

私はJavaを使用してJavaScriptファイルを解析しています。スコープが使用している環境で予想とは異なるため、ieのすべてのインスタンスを置き換えようとしています。

test = value

window.test = value

以前、私はちょうど使用していました

writer.append(js.getSource().replaceAll("test", "window.test"));

これは明らかに一般化できませんが、固定データセットの場合は正常に機能していました。

ただし、使用することになっている新しいファイル、古いファイルの更新バージョンでは、処理する必要があります。

window['test'] = value

([[test]])

testどちらの場合も一致させたくありませんが、新しいフォーマットがあるのはこの2つだけのようです。だから私の計画は、最初のキャラクター以外のものと一致するように正規表現を行うことでした'[それは([^'\[])test; ただし、実際には最初の文字を置き換えたくはありません。一致させたくない2つの文字のいずれでもないことを確認してください。

これは私にとって新しい状況でした。なぜなら、私はRegExpsとの置き換えにそれほど取り組んでおらず、パターンマッチングだけを行っているからです。それで私は周りを見回して、私が考えた解決策、「非捕獲グループ」と呼ばれるものを見つけました。Oracleページの説明は私が探していたもののように聞こえましたが、正規表現をに書き直したとき、(?:[^'\\[])test何も変更していない場合とまったく同じように動作しました。前の文字を置き換えましたtest。StackOverflowを見回しましたが、発見したことで、自分がやっていることはうまくいくはずだという自信がつきました。

期待どおりに機能しないのは何が間違っているのでしょうか。パターンを誤用していますか?

4

2 に答える 2

3

正規表現に文字の式を含めると、一致するものの一部になります。

秘訣は、置換文字列で一致するものを使用することです。そのため、そのビットを単独で置換します。

試す :

replaceAll("([^'\[])test", "$1window.test"));

置換文字列の$1は、キャプチャグループ1が一致したものへの逆参照です。この場合、それはテストに先行する文字です

于 2012-12-10T20:03:47.967 に答える
0

単純にテストしてみません"(test)(\s*)=(\s*)([\w\d]+)"か?そうすれば、一致する"test"のは、次に空白、'='記号、値(この場合は数字とアルファベット文字とアンダースコア文字で構成されます)だけです。次に、グループ(括弧の間)を使用して、値(および必要に応じて空白)を新しいテキストにコピーできます。

于 2012-12-10T20:12:33.957 に答える