2016-11-13 2 views
0

単語nをnとマッチさせることができる正規表現を探しています。それがもたらすであろう、のはn := 2を言ってみましょう:単語を2つずつ(またはnをnで)一致させる正規表現

Lorem ipsum

Lorem ipsum dolor sit amet, consectetur adipiscing elitipsum dolordolor sitsit ametは、consectetur adipiscingadipiscing elitを(ここではカンマを注意してください)。

私は\bを使用して、ワード境界を無駄にしようとしました。私は本当に私にn単語を与えることができる正規表現を見つけようとすると失われています... /\b(\w+)\b(\w+)\b/iは、それをカットすることはできませんし、複数の組み合わせを試してみました。

+0

[正規表現の学習](http://stackoverflow.com/questions/4736/learning-regular-expressions)の可能な複製 – Biffen

+0

@Biffenどのようにその質問と重複していますか? –

+0

これは基本的に* give-me-a-regex *の 'question'です。それらはすべて、その方法の(重複して)重複しています。 – Biffen

答えて

0

正規表現を分割する以外に、あなたがここで必要なものは本当にありません単語に入力します。問題は、この問題は、と重複している部分文字列をマッチさせることです。regexpはあまり良くありません。特にJavaScriptフレーバです。代わりに入力を単語に分解するだけで、JavaScriptの素早い部分が "n-grams"(n-wordグループの正しい用語です)を生成します。

const input = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"; 
 

 
// From an array of words, generate n-grams. 
 
function ngrams(words, n) { 
 
    const results = []; 
 

 
    for (let i = 0; i < words.length - n + 1; i++) 
 
    results.push(words.slice(i, i + n)); 
 

 
    return results; 
 
} 
 

 
console.log(ngrams(input.match(/\w+./g), 2));

0

ワード境界\bはない任意の文字を消費し、それがゼロ幅アサーションであり、そして唯一単語と非単語の文字間の位置をアサートし、文字列の先頭とワードチャーとの間の単語の文字と文字列の最後の間。あなたが\s+を使用する必要が

は、単語間空白を消費し、重複するマッチを取得するために肯定先読み技術の内側に取​​り込む使用:

var n = 2; 
 
var s = "Lorem ipsum dolor sit amet, consectetur adipiscing elit"; 
 
var re = new RegExp("(?=(\\b\\w+(?:\\s+\\w+){" + (n-1) + "}\\b))", "g"); 
 
var res = [], m; 
 
while ((m=re.exec(s)) !== null) { // Iterating through matches 
 
if (m.index === re.lastIndex) { // This is necessary to avoid 
 
     re.lastIndex++;   // infinite loops with 
 
}        // zero-width matches 
 
res.push(m[1]);     // Collecting the results (group 1 values) 
 
} 
 
console.log(res);

最終パターンを動的に構築されます変数を正規表現に渡す必要があるので、RegExpのコンストラクタ表記が必要です。それは

/(?=(\b\w+(?:\s+\w+){1}\b))/g 

のようになります。そして、それは次の順序で続いている文字列中のすべての場所を見つけるでしょう:

  • \b - 単語境界
  • \w+ - 1以上の単語文字を
  • (?:\s+\w+){n} - nのシーケンス:
    • 個の\s+ - 1以上の空白
    • \w+ - 1以上の単語文字
  • \b - 末尾の単語境界
+0

これは大規模な過剰殺到のようです。 –

+0

実用的な拡張可能なソリューションは過度のものではありません。 –

-1

ない純粋な正規表現のソリューション、それが動作し、読みやすく理解しやすいです:

let input = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit'; 
let matches = input.match(/(\w+,? \w+)/g) 
    .map(str => str.replace(',', '')); 

console.log(matches) // ['Lorem ipsum', 'dolor sit', 'amet consectetur', 'adipiscing elit'] 

が警告:なし一致をチェックしません(match()リターンはNULL)

関連する問題