为什么RegExp split()和match()给出不同的结果?

时间:2015-07-01 14:15:36

标签: javascript regex

s ='< w:p> abc< w:p z =“asd”> 123< w:p /> qwe< w:paa> asd< / w:p> zxc' x = new RegExp('< w:p(+ [^>] *> |> | />)','g') 的console.log(s.match(X)) 的console.log(s.split(X)) 输出是: ['< w:p>','< w:p z =“asd”>','< w:p />' ] ['',   '>',   'ABC',   'z =“asd”>',   '123',   '/>',   'qwe< w:paa> asd< / w:p> zxc'] 为什么match()匹配整个表达式< w:p(+ [^>] *> |> | />),但split()仅匹配表达式的第一部分,即< w :p?

2 个答案:

答案 0 :(得分:3)

结果的差异是由于正则表达式中捕获的组。如果您使用非捕获组,则两者的行为都相同:

x = new RegExp('<w:p(?: +[^>]*>|>|/>)','g')

现在split会给出:

console.log(s.split(x))
//=> ["", "abc", "123", "qwe<w:paa>asd</w:p>zxc"]

原因是split也将所有匹配的组放在输出数组中。

PS:您的正则表达式可以简化为:

x = /<w:p( +[^>]*>|\/?>)/g

答案 1 :(得分:0)

x = new RegExp('<\/?w:p[^>]*>', 'g')

给出

console.log(s.match(x)) == ["<w:p>", "<w:p z="asd">", "<w:p/>", "<w:paa>", "</w:p>"]

console.log(s.split(x)) == ["", "abc", "123", "qwe", "asd", "zxc"]
相关问题