1

JavaScriptの正規表現を扱うときに、括弧をキャプチャするという概念が本当にわかりません。次の例に括弧が必要な理由がわかりません

var x = "{xxx} blah blah blah {yyy} and {111}";
x.replace( /{([^{}]*)}/g , 
          function(match,content) {
               console.log(match,content);
               return "whatever";
});

//it will print
{xxx} xxx
{yyy} yyy
{111} 111

したがって、パターンから括弧を削除するとx、結果は異なる値になります

x.replace( /{[^{}]*}/g , 
          function(match,content) {
               console.log(match,content);
               return "whatever";
});

//it will print
{xxx} 0
{yyy} 37
{111} 49

そのため、コンテンツの値は数値になりましたが、その理由はわかりません。誰かが舞台裏で何が起こっているのか説明できますか?

4

4 に答える 4

4

MDN documentationによると、関数へのパラメーターは次の順序になります。

  • 一致した部分文字列。
  • 定義されているグループ (存在する場合)。
  • 一致が見つかった元の文字列のインデックス。
  • 元の文字列。

したがって、最初の例でcontentは、グループ 1 でキャプチャされた文字列になります。しかし、2 番目の例でグループを削除すると、content実際には一致が見つかったインデックスになります。

于 2013-10-22T22:07:53.510 に答える
0

数字:

検査中の全文字列内の一致した部分文字列のオフセット。(たとえば、文字列全体が「abcd」で、一致した部分文字列が「bc」の場合、この引数は 1 になります。)

ソース:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/replace

「パラメータとしての関数の指定」セクション

于 2013-10-22T22:08:10.710 に答える
0

括弧は、一致の一部のみをキャプチャ/置換するために使用されます。たとえば、内線番号がある場合とない場合がある電話番号を照合するために使用する場合です。この関数は文字列全体に一致するため (if正しい場合)、文字列全体が置き換えられますが、特定の種類の文字のみを特定の順序で使用し、空白またはその他の ("() -x") 文字を許可しています入力。

6512589631x1234 または 1 651 258 9631 1234 が指定された場合、(651) 258-9631 x1234 にフォーマットされた文字列を常に出力します。分野。

function phoneNumber(v) {
// take in a string, return a formatted string (651) 651-6511 x1234
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi) !== -1) {return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,2}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})[\s]*[x]{0,1}([0-9]{1,5}){1}$/gi,"($1) $2-$3 x$4"); }
if (v.search(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi) !== -1) { return v.replace(/^[1]{0,1}[-(\s.]{0,1}(?!800|888|877|866|855|900)([2-9][0-9]{2})[-)\s.]{0,1}([2-9][0-9]{2})[-.\s]{0,2}([0-9]{4})$/gi,"($1) $2-$3"); }
return v;
}

これにより、市外局番、プレフィックス、回線番号、およびオプションの内線番号を収集し、必要な方法でフォーマットすることができます (たとえば、指示に従えないユーザー向け)。

したがって、6516516511x1234 または "(651) 651-6511 x1234" を入力すると、この例のいずれかの正規表現に一致します。

@amine-hajyoussefが言ったように、コードで何が起こっているのか- 各マッチの開始のインデックスが返されています。そのコードの使用は、match例 1 (テキストが返される)、またはsearch例 2 のようにインデックスによってより適切に処理されます。pswgの答えが展開されます。

于 2013-10-22T22:20:56.173 に答える