'"aaa" "bbb"'.match(/("|')[^\1]+\1/g)
// ['"aaa" "bbb"']
'"aaa" "bbb"'.match(/("|')[^"]+\1/g)
// ['"aaa"', '"bbb"']
为什么[^\1]+
代替[^"]+
使RegExp变得贪婪?
答案 0 :(得分:3)
为什么
[^\1]+
代替[^"]+
使RegExp变得贪婪?
这不是你认为的那样。
首先,+
总是 最大匹配,你称之为“贪婪”。它是+?
最小匹配。
其次,更重要的是,反向引用不会发生在方括号字符类中。你不小心刚要求除Control-A之外的任何角色。这是因为反斜杠后跟数字意味着代码指向八进制表示法,如\177
DELETE
\x7F
的{{1}}或SPACE \40
的{{1}},或者\x20
表示NULL。所以当你写\0
时,你刚刚使用了U + 0001或\1
。不要那样做。 :)
你可能想要使用
\x01
代替。您需要(["'])(?:(?!\1).)+\1
模式,以便点可以匹配换行符,我似乎记得Javascript有一些搞砸了。
编辑:根据this,笨拙的旧Javascript无法使点匹配换行符。什么是rimnods!当然,因为Javascript无法执行Unicode正则表达式,所以您无法使用UTS#18’s RL1.2所需的/s
。
这意味着如果您的引用字符串中可能包含换行符,则必须使用\p{Any}
之类的蹩脚kludge。
答案 1 :(得分:1)
[^\1]+
没有按照您的想法执行,它与不是\
或1
的字母匹配。其中包括"
和"
'。
正确的替代方案,使用否定前瞻:
/(["'])(?:(?!\1).)*\1/g
或更简单地说:
/"[^"]*"|'[^']*'/g