Javascript 正则表达式,用于基于相同单词创建多个单词片段

Javascript 正则表达式,用于基于相同单词创建多个单词片段,javascript,regex,permutation,Javascript,Regex,Permutation,假设我有以下字符串: var str = "I like barbeque at dawn"; 我想要一对用空格隔开的单词。这可以通过以下正则表达式实现: var regex = /[a-zA-Z]+ [a-zA-Z]+/g; str.match(regex); 这导致: ["I like", "barbeque at"] 但是如果我想要所有成对的排列呢?正则表达式失败,因为它只匹配任何给定的单词once。例如,这就是我想要的: ["I like", "like barbeque"

假设我有以下字符串:

var str = "I like barbeque at dawn";
我想要一对用空格隔开的单词。这可以通过以下正则表达式实现:

  var regex = /[a-zA-Z]+ [a-zA-Z]+/g;
  str.match(regex);
这导致:

["I like", "barbeque at"]
但是如果我想要所有成对的排列呢?正则表达式失败,因为它只匹配任何给定的单词once。例如,这就是我想要的:

["I like", "like barbeque", "barbeque at", "at dawn"]

我知道我可以使用递归回溯模式来生成置换。正则表达式有能力为我创建这些类型的对吗

使用带有捕获的前瞻,允许重叠匹配:

(\w+)\s+(?=(\w+))

如果您希望在一个组中捕获,而不是在两个组中捕获,则可以选择:

(?=(\b\w+\s+\b\w+))

此正则表达式将执行以下操作:

(?=\b([a-zA-Z]+ [a-zA-Z]+))

说明:

  • 我们使用前瞻
    (?=…)
    ,以避免测试输入字符串中的每个位置。因此,我们仍将“移动”整个字符串,而不使用任何字符
  • \b
    将强制正则表达式引擎查找后续子模式返回的匹配之间的边界
  • ([a-zA-Z]+[a-zA-Z]+)
    是收集两个单词短语的捕获组
示例代码:

var re = /(?=\b([a-zA-Z]+ [a-zA-Z]+))/g;
var str = 'i like barbeque at dawn';

while ((m = re.exec(str)) !== null) {
    document.getElementById("res").innerHTML += m[1] + "<br/>";
}
var re=/(?=\b([a-zA-Z]+[a-zA-Z]+)/g;
var str=‘我喜欢黎明时分的烧烤’;
while((m=re.exec(str))!==null){
document.getElementById(“res”).innerHTML+=m[1]+“
”; }
您可以执行以下操作:

(\w+)\s+(?=(\w+))
并用
($1,$2)


您可以为此使用lookaheads:

var str = "i like barbeque at dawn";
var regex = /(?=\b([a-zA-Z]+ [a-zA-Z]+)\b)/g;
var matches= [];

while ((match = regex.exec(str)) != null) {
    if (match.index === regex.lastIndex)
       regex.lastIndex++;
    matches.push(match[1]);
}

console.log(matches);
//=> ["i like", "like barbeque", "barbeque at", "at dawn"]

\s
之后不需要
\b
,因为它已经是非单词字符。而且
\w
不像原来的帖子那样
[a-zA-Z]
。为什么要使用数字和下划线?也许是因为其他答案启发了你:)?
var str = "i like barbeque at dawn";
var regex = /(?=\b([a-zA-Z]+ [a-zA-Z]+)\b)/g;
var matches= [];

while ((match = regex.exec(str)) != null) {
    if (match.index === regex.lastIndex)
       regex.lastIndex++;
    matches.push(match[1]);
}

console.log(matches);
//=> ["i like", "like barbeque", "barbeque at", "at dawn"]