1

次の URL を想定します。http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.100x100-75.jpg

最後の 100x100 を 256x256 に置き換えます。URL は次のようになります。

http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.256x256-75.jpg

JavaScript の replace メソッドは次のとおりです。

replace( /100x100(?!100x100)/, '256x256' )

残念ながら、最後ではなく最初のオカレンスを常に置き換えます。

私たちは何を間違っていますか?

ありがとう!

4

4 に答える 4

4

これを試して:replace( /100x100(?!.*100x100)/, '256x256' )

.*の最初の出現と最後の出現の間に追加の文字のアカウントを追加します100x100

- 私の回答では、パターンのどこが間違っていたかとその修正方法について説明していますが、Billy Moon が提供する回答は、おそらく、あなたがやろうとしていることのより良いパターンです。

于 2013-03-12T21:28:09.480 に答える
3

それを行う別の方法...

replace( /(.*)100x100/, '$1256x256' )

によって動作します...

  1. 100x100を使用して、可能な限り貪欲にすべて(.*)をグループ1にキャプチャします。
  2. マッチング100x100
  3. キャプチャされていない一致の代わりにを使用$1して追加することにより、キャプチャされたグループ1に置き換えます256x256

注意?:この方法は、最後の一致(または、後にを追加して最初のキャプチャを貪欲にしない場合は最初の一致)でのみ機能します.*

通常、パフォーマンス上の理由から、さまざまな正規表現実装との互換性のために、ルックアラウンドアサーションの使用を避けるのは良いことです。また、読みやすさのためにも信じています。

編集:テストスクリプト

var url = "http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.100x100-75.jpg"

console.log(url.replace(/(.*)100x100/, '$1256x256'))

// OUTPUT:
// http://a2.mzstatic.com/us/ryoyo0/078/Purple100x100/v4/38/e3/b4/38e3b4a2-b422-8d1e-69f2-593fc035c9d4/mzl.vqhwzhhc.256x256-75.jpg
于 2013-03-12T21:33:45.317 に答える
0

否定先読みを変更して、スラッシュも探すことができます。2 番目のオカレンスはスラッシュではなくピリオドで終わるため、これで解決するはずです。

/100x100(?!\/)/
于 2013-03-12T21:30:53.863 に答える
0

意図が誤解されている可能性があるため、URL100x100のファイル名部分に表示される sのみを置き換える (文字列内のその後に表示されない) 別のアプローチです。/

replace(/100x100([^\/]*)$/, '256x256$1')

作品...

  1. マッチング100x100
  2. ... グループ 1 へのキャプチャが続きます。0 個以上、スラッシュではありません。([^\/]*)
  3. ... 文字列の末尾が続き、$
  4. 256x256と最初のキャプチャ グループに置き換え、$1

文字列の最後の後に一致がない場合/、置換は行われません。

NBこの回答、私の他の回答、および@Daedalusの回答の速度を確認しました。通常、アサーションを回避して正規表現を高速化することを期待していますが、この場合、それらはすべて速度が同じであることがわかりました。非常に高速で、私のコンピューターでは 1 秒間に数十万回実行されます。

于 2013-03-13T06:50:59.133 に答える