我正在寻找能够将字n和n匹配的正则表达式。让我们说n := 2
,它会产生:
Lorem ipsum dolor sit amet, consectetur adipiscing elit
Lorem ipsum
,ipsum dolor
,dolor sit
,sit amet
(请注意此处的逗号),consectetur adipiscing
,adipiscing elit
。
我尝试将\b
用于字边界无济于事。我真的迷失了,试图找到能够给我n
字的正则表达式... /\b(\w+)\b(\w+)\b/i
无法削减它,甚至尝试了多种组合。
答案 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;
答案 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)