web-dev-qa-db-ja.com

何らかの理由で2つの結果を返す部分文字列を抽出する正規表現

私はjavascriptで多くの正規表現を行う必要がありますが、構文にいくつかの問題があり、これに関する決定的なリソースを見つけることができないようです..

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test)

それが示している

"afskfsd33j, fskfsd33"

元の文字列と一致した文字列のこの出力を提供する理由がわかりませんが、単に一致させるだけで元の文字列から必要な部分を抽出する方法を疑問に思っています

アドバイスをありがとう

51
Rick

matchは配列を返します。

JavaScriptの配列のデフォルトの文字列表現は、コンマで区切られた配列の要素です。この場合、目的の結果は配列の2番目の要素にあります。

var tesst = "afskfsd33j"
var test = tesst.match(/a(.*)j/);
alert (test[1]);
89
Jacob Relkin

あなたの問題は、matchメソッドが配列を返していることだと思います。配列の0番目のアイテムは元の文字列で、1番目からn番目のアイテムは、1番目からn番目の一致する括弧付きアイテムに対応します。 「alert()」呼び出しは、配列全体を表示しています。

5
BillP3rd

括弧()で定義された各グループは処理中にキャプチャされ、キャプチャされた各グループコンテンツは、パターン内のグループが開始するのと同じ順序で結果配列にプッシュされます。 http://www.regular-expressions.info/brackets.html および http://www.regular-expressions.info/refcapture.html (選択サポートされている機能を確認するための正しい言語)

var source = "afskfsd33j"
var result = source.match(/a(.*)j/);

result: ["afskfsd33j", "fskfsd33"]

この正確な結果を受け取った理由は次のとおりです。

配列の最初の値は、パターン全体を確認する最初に見つかった文字列です。したがって、必ず「a」で始まり、その後に任意の数の文字が続き、「a」の後に最初の「j」文字で終わる必要があります。

配列の2番目の値は、括弧で定義されたキャプチャグループです。あなたのケースグループには、括弧の外側にコンテンツが定義されていないパターンマッチ全体が含まれているため、まさに「fskfsd33」です。

配列の2番目の値を削除する場合は、次のようなパターンを定義できます。

/a(?:.*)j/

ここで、「?:」は、括弧内のコンテンツに一致する文字のグループが結果の配列の一部ではないことを意味します。

この単純なケースでは、グループをまったく使用する必要がないため、グループなしでパターンを記述する他のオプションがあります。

/a.*j/

ソーステキストがパターンに一致するかどうかを確認するだけで、どのテキストが見つかったかは気にする必要はありません。

var result = /a.*j/.test(source);

結果はtrue | falseの値のみを返します。詳細については、 http://www.javascriptkit.com/javatutors/re3.shtml を参照してください

4
Jan Stanicek

私はちょうど同じ問題を抱えています。

一致グループ(括弧内)と 'g'(グローバル)修飾子を含めると、結果にテキストが2回だけ表示されます。最初の項目は常に最初の結果であり、通常は短い文字列でmatch(reg)を使用する場合は問題ありませんが、次のような構造を使用する場合は:

while ((result = reg.exec(string)) !== null){
    console.log(result);
}

結果は少し異なります。

次のコードを試してください:

var regEx = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
var result = sample_string.match(regEx);
console.log(JSON.stringify(result));
// ["1 cat","2 fish"]

var reg = new RegExp('[0-9]+ (cat|fish)','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null) {
    console.dir(JSON.stringify(result))
};
// '["1 cat","cat"]'
// '["2 fish","fish"]'

var reg = new RegExp('([0-9]+ (cat|fish))','g'), sampleString="1 cat and 2 fish";
while ((result = reg.exec(sampleString)) !== null){
    console.dir(JSON.stringify(result))
};
// '["1 cat","1 cat","cat"]'
// '["2 fish","2 fish","fish"]'

(最近のV8でテスト済み-Chrome、Node.js)

現時点での最良の答えは、私が賛成できないコメントですので、@ Micに感謝します。

3
techturbulence

括弧を削除するだけで、1つの要素と次の配列が得られます。

  • この行を変更

var test = tesst.match(/ a(。*)j /);

  • これに

var test = tesst.match(/a.*j/);

括弧を追加すると、match()関数は、式全体と括弧内の式の2つの一致を検出します

  • Developer.mozilla.orgのドキュメントによると:

最初に一致したものだけを見つけたい場合は、代わりにRegExp.exec()を使用できます。

以下のコードを使用できます。

RegExp(/a.*j /)。exec( "afskfsd33j")

2
Ekrami