3

私は一致/(?=\W)(gimme)(?=\W)/giするか、同様に探しています。私の\W実際の試合を囲むためにゼロ幅の文字であるはずです。

たぶん、いくつかの背景。特定の単語 (常に ) をリテラルのパディングを追加して置き換えたい\w+のですが、それが . で囲まれていない場合に限り\wます。(それは否定的なルックアラウンドのように聞こえますが、JSはそれらをしないと聞きました!?)

(ところで:上記の「ギミー」は、私が置き換えたいリテラルという言葉です。それが明らかでない場合。)

意図が aであり、周囲の文字を置換/コピーできない\Wため、ゼロ幅でなければならないため、(?) ルックアラウンドである必要があります。.replace(...)

したがって、これは機能しません:

text.replace(/(?=\W)(gimme)(?=\W)/gi, function(l, match, r) {
  return l + doMagic(match) + r;
})

ゼロ幅の文字は無視する必要があるため、関数はのみ doMagic(match)を返す (および置換する) ことができます。

私はルックアラウンドの経験が非常に限られており、JS では経験がありません。グラジー。

PS。それとも後読みが必要で、それらは JS でサポートされていません..? よくわかりません?

PS。少しのコンテキスト: http://jsfiddle.net/rudiedirkx/kMs2N/show/ (おおリンク!)

4

3 に答える 3

3
  • 単語境界ショートカット\bを使用して、一致する単語全体であることを主張できます。

  • あなたがやりたいことを達成する最も簡単な方法は、おそらく一致することです:

/(\s+gimme)(?=\W)/gi

と置き換え[yourReplacement]ます-つまり、「gimme」の前の空白をキャプチャし、置換に1つ含めます。

  • これにアプローチする別の方法は、リテラルの前後により多くの文字をキャプチャしてから、gimme後方参照でグループを使用することです。

(\W+?)gimme(\W+?)- あなたの一致 - 今回は前後の文字がキャプチャ グループ 1 と 2 にあることに注意してください

\1[yourReplacement]\2そして、置換文字列として使用したいと思います-JSで後方参照をどのように使用するかはわかりません\1が、最初のキャプチャ括弧によって一致したものは何でも意味することをエンジンに伝えるという考えです。一部の言語では、これらは でアクセスできます$1

于 2012-06-08T18:34:11.417 に答える
2

次の理由により、現在持っているものは機能しません。これは、(?=\W)「次の文字は単語の文字ではない」ことを意味し、次に一致させようとするものはリテラルgであるため、矛盾があります (「次の文字はg, しかし、手紙ではない」)。

実際には後読みが必要ですが、JavaScript ではサポートされていません。

考えられるアプローチについては、JavaScript での後読みの模倣に関するこの記事を参照してください。

于 2012-06-08T18:30:26.520 に答える
1

レクサー/パーサーの組み合わせを使用することを検討しましたか?

これは JavaScript ベースで、気の利いたデモンストレーションが付属しています。

于 2012-06-08T18:35:06.813 に答える