Regexp匹配两个字(或n乘n)

时间:2016-11-13 10:08:55

标签: javascript regex node.js text nlp

我正在寻找能够将字n和n匹配的正则表达式。让我们说n := 2,它会产生:

Lorem ipsum dolor sit amet, consectetur adipiscing elit

Lorem ipsumipsum dolordolor sitsit amet(请注意此处的逗号),consectetur adipiscingadipiscing elit

我尝试将\b用于字边界无济于事。我真的迷失了,试图找到能够给我n字的正则表达式... /\b(\w+)\b(\w+)\b/i无法削减它,甚至尝试了多种组合。

3 个答案:

答案 0 :(得分: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+ - 一个或多个单词字符
  • (?:\s+\w+){n} - n序列:
    • \s+ - 一个或多个空格
    • \w+ - 一个或多个单词字符
  • \b - 尾随字边界

答案 1 :(得分:0)

除了将输入分成单词之外,正则表达式并不是您真正需要的。问题是这个问题涉及匹配重叠子串,regexp不是很擅长,特别是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));
&#13;
&#13;
&#13;

答案 2 :(得分:-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)