正则表达式与非捕获组分开

时间:2018-04-19 17:45:33

标签: javascript regex

我希望匹配html标记名(例如< div>中的div),然后将该字符串拆分到匹配位置。



var str = '<div> div';
var regex = /(?:<)(\w*)(?=>)?/g;
var arr = str.split(regex);
console.log(arr);
//result:   ["", "div", "> div"]
//expected: ["<", "> div"]




然而,"& lt;"这样做会迷路,而且我想要<和>除去。我怎样才能实现它?


这个也不起作用,因为那时"假-d"在字符串的末尾也会被分割,即使它不在<和>:



var str = '<div> div';
var regex = /(?:<)(\w*)(?=>)?/g;
var match = regex.exec(str);
var arr = match.input.split(match[1]);
console.log(arr);
//result:   ["<", "> ", ""]
//expected: ["<", "> div"]




1 个答案:

答案 0 :(得分:0)

如果您只想使用单个正则表达式,最接近的一个是:

var regex = /\b(?:\w+)(?=>)/gi;
'<div> div'.split(regex);//["<", "> div"]

它给出了预期的行为,但这个问题的明显问题是它不检查前面的<。并且javascript本身不支持lookbehind。

更好的方法可能是将<>分开,然后将它们合并:

var str = '<div> div';
var ltRgx = /(?:\s|\b|^)(?=&lt)/gi;
var gtRgx = /\b(?:\w+)(?=>)/gi;
var result = str.split(ltRgx).map(function(d,i){
    return d.split(gtRgx)
}).reduce(function(ac,d){
    return ac.concat(d);
});
console.log(result);//["<", "> div"]
/*Another example*/
str = '<div> <img> div';
result = str.split(ltRgx).map(function(d,i){
    return d.split(gtRgx)
}).reduce(function(ac,d){
    return ac.concat(d);
});
console.log(result);//["<", ">", "<", "> div"]