2016-05-23 6 views
0

私は、以下の複数行のリストから番号を保持するグループを作成しようとしています。 正規表現はここで働いているようです - https://regex101.com/r/tS5qV5/1私はnodejsでそれを実行すると正しい出力を得られません。何が間違っている可能性がありますか?常に第1グループの番号を保持

正規表現

/(\d{1,3}(?:\.\d{1,2}){0,1})?(km\/h|m\/h)?(?:(?:audi|bmw)(?:\scoupe)*)*/gmi 

テキスト

2.33 km/h 
km/h 2.33 

結果

2.33 km/h - >[ '2.33', '', 'km/h', '' ]

km/h 2.33 - >[ 'km/h', '', '2.33', '' ]

期待両方のラインのための

[ '2.33', 'km/h']

ノードコード

var match = req.match(/(\d{1,3}(?:\.\d{1,2}){0,1})?(km\/h|m\/h)?(?:(?:audi|bmw)(?:\scoupe)*)*/gmi); 

console.log(match); 
+0

あなたは、正確なノードのコードを表示してください:あなたは正しい結果を構築しますを使用して。 –

+0

ノードコード@torazaburoを追加しました – Ando

答えて

1

はあなたが必要なものサポートされていない分岐リセット機能ですJS正規表現エンジン

あなただけの通常のグループ化構成体の中に取り込み、その後、あなたの結果の配列は、あなたが必要とする値が含まれ得るために、いくつかのJSのロジックを追加使用することができます。

/(?:(\d{1,3}(?:\.\d{1,2})?)\s*(k?m\/h)|(k?m\/h)\s*(\d{1,3}(?:\.\d{1,2})?))?(?:(?:audi|bmw)(?:\scoupe)*)*/gi 

the regex demoを参照し、以下に役立つコードです

var re = /(?:(\d{1,3}(?:\.\d{1,2})?)\s*(k?m\/h)|(k?m\/h)\s*(\d{1,3}(?:\.\d{1,2})?))?(?:(?:audi|bmw)(?:\scoupe)*)*/gi; 
 

 
function testResults(str) { 
 
var res = []; 
 
while ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { 
 
     re.lastIndex++; 
 
    } 
 
    if (m[1]) { 
 
     res.push(m[1], m[2]); //First goes Group 1, then Group 2 
 
    } else if (m[3]) { 
 
     res.push(m[4], m[3]); // Swapping to ensure the same order 
 
    } else if (m[0]) { 
 
     res.push(m[0]); 
 
    } 
 
} 
 
return res; 
 
} 
 

 
var s = '2.33 km/h audi bmw coupe coupe'; 
 
document.body.innerHTML = "<pre>" + s + "<br/>" + JSON.stringify(testResults(s), 0, 4) + "</pre>"; 
 
s = 'km/h 2.33'; 
 
document.body.innerHTML += "<pre>" + s + "<br/>" + JSON.stringify(testResults(s), 0, 4) + "</pre>"; 
 

 
// Results: 
 
// '2.33 km/h audi bmw coupe coupe' => ["2.33","km/h", "audi", "bmw coupe coupe"] 
 
// 'km/h 2.33'      => ["2.33","km/h"]

+0

こんにちはWiktor、答えに感謝します。私は、JSが重要な正規表現機能であると思われるものを提供していないことに驚いています。とにかく、第1グループの前、または第1グループと第2グループの間に「アウディ」または「BMWクーペクーペ」の弦があるかどうかを知りたかったのです。グループが数値または速度測定の場合、より短い正規表現に対してチェックするケースを持つ 'switch'を持つ必要がありますか?だから、流れはグループを定義してループして、それらが何であるかを知ることでしょうか? – Ando

+0

あなたが見ることができるのは、オプションの部分文字列をキャプチャしてから、いくつかのロジックを使って一致したものをチェックすることだけです。別の短いパターンを使用したい場合は、回避することもできます。多分より良いものかもしれません –

+1

私はそれがより柔軟性を提供し、 '^'と '$'との厳密なマッチングを使うとより速くなると思います。答えをありがとう。私は正規表現について調べ始めました。問題を解決するには、その限界が不可欠であることを知っています。 – Ando

関連する問題