2017-01-24 5 views
1

のための正規表現、デザイン、以下の2つの文の場合、文とそのサブセット

var first_sentence = 'My cat is sleeping'; 
var second_sentence = 'My cat is sleeping with a blanket'; 

私は動詞(睡眠)と名詞(毛布)の両方を取得するには、次の正規表現を使用しようとしました。

var regex = /My cat is (.+?)\s+with.?(.+)?/gi.exec('My cat is sleeping with a blanket'); 
console.log(regex); 
/* 
[ 0 : 'My cat is sleeping with a blanket' 
    1 : 'sleeping' 
    2 : 'a blanket' 
    index : 0 
    input : 'My cat is sleeping with a blanket' 
    length : 3 ] 
*/ 

この正規表現はうまくいきましたが、最初の文に適用すると、nullが返されます。最初の文で

var regex = /My cat is (.+?)\s+with.?(.+)?/gi.exec('My cat is sleeping'); 
console.log(regex); 
// null 
+0

、それは「1又はそれ以上の空白文字」を意味する '\ S +'を達したときに何 ' –

+0

WITH'マッチが失敗していないがあります。 –

答えて

1

、いかなる\s+with.?(.+)?部分はが(1+空白、次いでwith)存在するテキストを必要とすることはありません。あなたは(?:....)?とオプションであるパターンの一部をラップする必要があります。

/My cat is (\S+)(?:\s+with\s+(.*))?/gi 

regex demo

詳細参照してください:

  • My cat is - リテラルテキスト
  • (\S+) - グループ1 1+非空白シンボルをキャプチャする
  • (?:\s+with\s+(.*))? - の任意の配列: -
  • (.*)両側1+空白で囲まwithワード -
    • \s+with\s+改行記号以外の任意の0+文字をキャプチャグループ2

JS:

var ss = [ "My cat is sleeping", "My cat is sleeping with a blanket"]; 
 
var rx = /My cat is (\S+)(?:\s+with\s+(.*))?/i; 
 
for (var s = 0; s < ss.length; s++) { 
 
    document.body.innerHTML += "Testing \"<i>" + ss[s] + "</i>\"... "; 
 
    if ((m = ss[s].match(rx))!==null) { 
 
    document.body.innerHTML += "Found: <b>" + m[1] + "</b>" + (m[2] ? " and <b>" + m[2] : "") + "</b><br/>"; 
 
    } else { 
 
     document.body.innerHTML += "NOT Matched: <b>" + ss[s] + "</b><br/>"; 
 
    } 
 
}
最初の文で10

+0

はい、私の不注意な間違い –

+0

ちょうどあなたが文字列の最後を気にしないことに気付き、それをパターンから削除しました。 '。*'は行全体の残りの部分と一致します。 –

関連する問題