4

これを考えると:

str = "foo myfoo http://thefoobar.com/food is awesome";
str.replace(magicalRegex, 'bar');

期待される結果は次のとおりです。

"bar myfoo http://thebarbar.com/bard is awesome"

パーツを取得しましたが、URL内から\b(foo)\b一致させてキャプチャする方法がわかりません。fooこれらの目的のために、URLは常に。で始まると想定しhttpます。

何か助けはありますか?

4

3 に答える 3

5

このコードを使用できます(例ではうまく機能しますが、より複雑な入力は試していません)。

str = 'foo myfoo http://thefoobar.com/food is awesome';
str = str.replace(/\bfoo\b/g, 'bar');
while (/http:\/\/[^\s]*?foo/.test(str))
    str = str.replace(/(http:\/\/[^\s]*?)?foo/g, function($0, $1) {
        return $1 ? $1 + 'bar' : $0;
    });
console.log(str);

出力:

bar myfoo http://thebarbar.com/bard is awesome

ライブデモ: http: //ideone.com/8xGy2h

于 2013-03-12T20:51:10.707 に答える
0

これを正しく行うには、多段階で行う必要があると思います。基本的に、ここでは2つの別々の(ただし、類似した)正規表現の置換を行っています。

  1. リンク内で発生する場合は、文字グループ「foo」のグローバル置換、および
  2. 文字列の残りの部分にある「foo」という単語のグローバルな置換。

このコードは、両方のステップを別々に実行し(URLを最初に、残りの文字列を2番目に)、最終的な置換を行います。

var urlPattern = /(http:\/\/[^\s]+)/;
var urlFooPattern = /(foo)/g;
var globalFooPattern = /\b(foo)\b/g;

var str = "foo myfoo http://thefoobar.com/food is awesome";

var urlString = str.match(urlPattern)[0];
urlString = urlString.replace(urlFooPattern, "bar");

str = str.replace(urlPattern, urlString);

str = str.replace(globalFooPattern, "bar");             

注:これは、文字列にURLが1つしかないことを前提としています。。。複数のURLの可能性を処理するには、もう少し複雑になります。

  1. var urlString = str.match(urlPattern)配列で使用してすべてのURLをキャプチャします
  2. 各URLをループして新しい配列を作成し、それぞれに対して個別に「fooreplace」を実行します
  3. 一致の元の配列をループし、それらをパターンとして使用して、2番目の配列の更新された値に置き換えます

によって返されるすべてのURLをvar urlString = str.match(urlPattern)ループし、それらの「foo」を個別に置き換え、再度ループしてから、元の文字列で一度に1つずつ置き換えます。

于 2013-03-12T20:44:14.597 に答える
-1

境界を使用して「foo」のみに一致させ、「myfoo」には一致させない場合は、または操作(|)を使用してURLを一致させる必要があります。必然的に、「foo」がURLの途中に含まれている場合、単語の境界に囲まれません。

このようなものがあなたのために働くはずです:

\b(foo)\b | http\S*(foo)\S*

必要に応じて、ここでさらにテストを実行できます。


編集:お詫び、私はOPがそれらの単語とURLをキャプチャしようとしていると思いました。置換のためにURLのルートをキャプチャしない後読み正規表現は、私が知る限りJSで本質的にサポートされていませんが、単純な関数で頻繁に複製できます。その方法については、こちらを参照してください

于 2013-03-12T19:48:21.973 に答える