2016-11-13 98 views
0

我正在寻找能够匹配n个字的n个正则表达式。比方说n := 2,它会产生:正则表达式匹配两个两个字(或n乘n)

Lorem ipsum dolor sit amet, consectetur adipiscing elit

Lorem ipsumipsum 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 *'问题'。它们都是重复的(在某种程度上)。 – Biffen

回答

0

正则表达式是不是真的,你在这里需要什么,除了分裂输入单词。问题是这个问题涉及匹配重叠子字符串,这正则表达式不是很擅长,特别是JavaScript的味道。相反,只需简单地将输入内容分解为单词,一小段JavaScript就会生成“n-gram”(这是n个词组的正确术语)。

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

这似乎是大规模的矫枉过正。 – 2016-11-13 12:18:58

+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)

相关问题