你会认为之前有人问过这个问题,但我找不到。
我需要用未引用的逗号分隔js字符串。我只使用双引号,这样可以使它更简单。
我尝试了两种方法,但没有将其钉住。
我需要转过身来:
'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'
进入这个:
[
'body.loaded"who, are , you" div"hello ,"#div-id span CODE',
'body.loaded span"span, text" code'
]
1) - >匹配好的部分,这些部分主要起作用,但在我的结果中给了我很多空字符串。
'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'.match(
/([^,]*"[^"]*")*/g
)
['body.loaded"who, are , you" div"hello' ,'', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' body.loaded span"span, text"', '', '', '', '', '', '']
我认为这是因为正则表达式中的()。
2)拆分不好的部分,这还不够。这里的想法是匹配逗号后跟偶数“。
'body.loaded"who, are , you" div"hello ,"#div-id span CODE, body.loaded span"span, text" code'.split(
/,(?![^"]*"[^"]*("[^"]*"[^"]*)*$)/
);
基本上,必须有一个更简洁,更美观的解决方案(请记住javascript不支持外观)。
答案 0 :(得分:12)
假设你不支持双引号字符串中的转义,这应该可行:
/(?:"[^"]*"|[^,])+/g
如果你确实想在双引号字符串中支持反斜杠转义,这应该可以完成这项任务:
/(?:"(?:\\.|[^"])*"|[^,])+/g
如果你想在双引号字符串之外支持反斜杠转义(例如转义初始引号),那么试试这个:
/(?:"(?:\\.|[^"])*"|\\.|[^,])+/g
以下是对第三种模式如何运作的解释。
首先,扩展的带注释的版本:
(?: # start a non-capturing group
" # Match a double quote
(?: # Another non-capturing group, for the contents of the double-quote
\\. # Match any backslash-escaped character
| [^"] # or any non-double-quote character
)* # End the group. Repeat zero or more times
" # Close double quote
| # Alternative to double-quoted string
\\. # Match any escaped character
| # Another alternative
[^,] # Match any non-comma character
)+ # Close group, repeat one or more times
这里有三个主要组成部分。
第一个是匹配任何双引号字符串。这首先出现在组中,因为如果双引号字符串在这里可能匹配,则应该使用非逗号规则。在这个双引号字符串中,我们可以匹配任何转义字符(\\.
),这可以让我们在字符串中转义双引号,或者匹配任何非双引号字符。我们一次只匹配一个字符,以便不使用非双引号字符规则捕获转义。字符串的内容使用*
,因为双引号字符串可能为空,然后我们终止字符串。
我们可能只匹配任何转义字符(\\.
),而不是双引号字符串。这使我们可以在双引号字符串之外转义双引号字符。它实际上让我们也逃脱了逗号,我不确定你是否想要。如果您不想要,则此规则应改为\\[^,]
。
最后,如果我们在这里不能匹配双引号字符串,并且我们无法匹配转义符,只需匹配任何非逗号字符。这不会重复,以免后来使用此规则捕获双引号或转义。
然后我们继续使用+
修饰符重复整个模式。这使我们可以一次匹配多个令牌。我们使用+
代替*
来避免在结果中返回空字符串。