如何使用正则表达式和JavaScript获得相邻匹配?

时间:2017-02-14 19:42:53

标签: javascript regex

我写了以下代码:



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;
&#13;
&#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

如何解决?

如果有的话,我很抱歉我的英语。

3 个答案:

答案 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

这比你想要的要多,但是如果你想用普通的正则表达式解决这个问题,那么这应该是关闭的。