Javascript:用于解析包含转义引号的引用字符串的正则表达式 - 返回未终止的字符类

时间:2015-12-08 20:30:27

标签: javascript regex

正在搜索有效解析包含转义引号的字符串的正则表达式,我最后得到的是正则表达式字面值:

/"[^"\\]*(?:\\.[^"\\]*)*"/

例如,如果用于分割字符串,那么它的工作正常且快速:

var str = 'This is a block of text containing a "string with a \" (escaped quote) in it"';

str.split(/("[^"\\]*(?:\\.[^"\\]*)*")/);

当我尝试使用内置的RegEx对象动态构建正则表达式时,问题就出现了:

/* splits by space characters and 
strings containing escaped quote */
var re = new RegExp("(\\s|\"[^\"\\]*(?:\\.[^\"\\]*)*\")");

我知道这个用例需要逃避元字符和引号。然而,我得到了以下错误:

Safari说

SyntaxError: Invalid regular expression: missing terminating ] for character class

火狐:

SyntaxError: unterminated character class

顺便说一下,从Safari返回的错误信息让我更加清楚地表明正则表达式引擎检测到缺少关闭的方括号,要求反斜杠字符在其自身之前被转义如下:

                                 v               v
var re = new RegExp("(\\s|\"[^\"\\\\]*(?:\\.[^\"\\\\]*)*\")");

但是这样我意识到包含转义引号的字符串不再正确解析。

非常感谢任何帮助或建议。

1 个答案:

答案 0 :(得分:0)

考虑到上面的评论,我对这个主题进行了更深入的研究,最后,由于@NullUserException指出的观察,我得到了解决方案。我已经意识到正则表达式对象:

var re = new RegExp("(\\s|\"[^\"\\\\]*(?:\\.[^\"\\\\]*)*\")");

没有用,因为仅仅是疏忽我没有正确地逃避检测前面有反斜杠(逃避字符)的字符的部分。因此,在字符串中,序列\\.必须为\\\\.

var re = new RegExp("(\\s|\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")");

这是一个简单的现场演示:http://jsfiddle.net/9ctw66pu/