我写了以下代码:
var RegExpression = new RegExp ("!?[a-z][&|]!?[a-z]", "g");
document.addEventListener("DOMContentLoaded", function() {
submit.addEventListener("click", function() {
alert(document.getElementById ("expression")
.value.match(RegExpression).join(", "));
});
});

<input type="text" id="expression">
<input type="button" id="submit" value="Submit!">
&#13;
我想从这段代码中得到以下内容:
示例输入:!a&amp; b | c&amp;!d&amp; e | f
输出:!a&amp; b,b | c,c&amp;!d,d&amp; e,e | f
,但我明白了:
输出:!a&amp; b,c&amp;!d,e | f
如何解决?
如果有的话,我很抱歉我的英语。
答案 0 :(得分:2)
我不知道是否可以直接用正则表达式完成,但是你可以做的一件事就是在循环中使用正则表达式对象的.exec()
方法。
因为你的正则表达式是全局g
,所以正则表达式对象保持最后一个匹配的结束点的状态。它存储在正则表达式对象的.lastIndex
属性中并且是可变的,因此您可以在执行下一次调用之前将其减少一个位置。
var re = /!?[a-z][&|]!?[a-z]/g;
var input = "!a&b|c&!d&e|f";
var match = null;
var result = [];
while ((match = re.exec(input))) {
result.push(match); // Add the match to our result Array
re.lastIndex -= 1; // Start the next call on the last char of the last match
}
console.log(result.join("\n\n"));
答案 1 :(得分:0)
我认为这应该适合你:
const input = document.createElement('input')
const result = document.createElement('div')
input.value = `!a&b|c&!d&e|f`
const split = data => {
const result = data.replace(/(!?\w+)/g, '$1,$1').replace(/.*?,/, '')
return result.substr(0, result.lastIndexOf(',')).split(',')
}
input.addEventListener('keyup', () => {
result.innerText = split(input.value).join(', ')
})
document.body.appendChild(input)
document.body.appendChild(result)
答案 2 :(得分:0)
(?=(!?[a-z][&|]!?[a-z])).
正向前方内部的匹配组可用于匹配重叠组。最后的点只是用来继续。
输出结果为:
!a&amp; b,a&amp; b,b | c,c&amp;!d,!d&amp; e,d&amp; e,e | f
这比你想要的要多,但是如果你想用普通的正则表达式解决这个问题,那么这应该是关闭的。