0

チャットの絵文字機能に単語境界を実装しようとしています。しかし、何らかの理由で、単語の境界を機能させることができないようです。私は正規表現が初めてです。

だから私がするとき:

var reg = /\b\Hi\b/gi;
var str = 'HiHiHi Hi HiHiHi Hi';
alert(str.replace(reg, ''));

これが起こります: Jsfiddle

実際には問題なく動作し、単独で立っている 2 つの Hi を削除します。

しかし、reg をエスケープされたスマイリーに変更してから文字列を変更すると、次のようになります。

var reg = /\b\:\)\b/gi;
var str = 'HiHi:) :) HiHiHi :)';
alert(str.replace(reg, ''));

これが起こります: Jsfiddle

うまくいきません。弦はそのままです。シンボルに単語境界を使用できないということですか? もしそうなら、Facebookはチャットでどのようにそれを行うのですか?

4

2 に答える 2

2

単語の境界は、単語の文字(javascriptでは)と単語以外の文字(その他すべて)\bの間のゼロ幅の境界を表します。\w[A-Za-z_]\W

このため、2つの絵文字の間に境界がないか、絵文字がスペースや句読点などで囲まれている場合はありません。

最も単純な正規表現は、オプションのダッシュと目またはウィンクで/[:;]-?[()]/giスマイリー)とフラウニーをサポートします。(:;

編集:

これには、スペースまたは文字列の先頭(Javascriptは後読みをサポートしていないためキャプチャグループとして)が必要です。次に、上記の正規表現を使用し、その後に文字列または空白の末尾を続ける必要があります。

var reg = /(\s|^)[:;]-?[()](?:\s|$)/gi;
var str = 'HiHi:) :) HiHiHi :)';
alert(str.replace(reg, '$1'));

これらの状況で交換する必要があります::-)cool :( not!

次のような状況では交換しないでください:Digits:(0,1,2,3)hi :(.

于 2012-06-11T16:25:06.217 に答える
0

この\b場合は機能しないため、次を使用できます。

var re = /(\s|^):\)(?!\S)/g;
var str = 'HiHi:) :) HiHiHi :)';
alert(str.replace(re, '$1'));

これは空間境界のように機能します。

次のように、いくつかのスマイリーを追加できます。

/(\s|^)(?::\)|:\(|:\||:\]|:\[)(?!\S)/g;
于 2012-06-11T16:36:46.740 に答える