0

手伝ってくれませんか。(?<=^|\s):d(?=$|\s)この正規表現をjavascript RegExpに追加するにはどうすればよいですか?

例えば

regex = new RegExp("?????" , 'g');

emoticon を置き換えたいのですが:d、スペースで囲まれている場合 (または文字列の末尾にある場合) のみです。

4

2 に答える 2

3

まず、Some1.Kill.The.DJ が述べたように、リテラル構文を使用して正規表現を作成することをお勧めします。

var pattern = /yourPatternHere/g;

短くて読みやすく、エスケープシーケンスによる複雑さを回避できます。

パターンが機能しない理由は、JavaScript が後読み ( をサポートしていないためです(?<=...)。したがって、その回避策を見つける必要があります。その文字をパターンに含めることはできません。

var pattern = /(?:^|\s):d(?!\S)/g;

いずれにせよパターン内の何かをキャプチャしても意味がないので (:dが固定されているため)、おそらくマッチの位置だけに関心があるでしょう。つまり、一致が見つかった場合、最初の文字が空白文字であるかどうか (またはそうでないかどうか) を確認する必要があります:。その場合は、位置を だけインクリメントする必要があります1。入力文字列がスペースで始まらないことがわかっている場合は、見つかった位置がスペースでない場合は単純にインクリメントできます0

先読みを少し単純化したことに注意してください。これは実際には、文字列の終わりと特定の文字タイプを区別する必要がないルックアラウンドの優れた点です。否定先読みを使用して、スペース以外の文字が先にないことを確認してください。

将来の参考のために、最初のパターンを次のように単純化できたことを意味します。

(?<!\S):d(?!\S)

(後読みをサポートする正規表現エンジンを使用している場合。)

編集:

他の回答についてコメントした後、実際には回避策を使用する方がはるかに簡単です。キャプチャしたスペース文字を書き戻すだけです。

string = string.replace(/(^|\s):d(?!\S)/g, "$1emoticonCode");

where$1は と一致したものを指し(^|\s)ます。つまり、一致が文字列の先頭にある$1場合は空になり、 の前:dにスペースがあった場合は、$1そのスペース文字が含まれます。

于 2012-12-09T16:08:03.503 に答える
1

Javascriptlookbehindつまり、サポートしていません(?<=)..

サポートしていますlookahead

より良い使用

/(?:^|\s)(:d)(?=$|\s)/g

Group1必要な一致をキャプチャ

于 2012-12-09T16:01:51.323 に答える