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"]