Javascript方法在无引号的逗号上拆分字符串

Javascript方法在无引号的逗号上拆分字符串,javascript,regex,string,split,Javascript,Regex,String,Split,你可能会认为这个问题以前被问过,但我找不到 我需要用不带引号的逗号分隔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',

你可能会认为这个问题以前被问过,但我找不到

我需要用不带引号的逗号分隔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) 把不好的部分分开,现在还没有。这里的想法是将逗号与偶数个“匹配”


基本上,必须有一个更干净、更简单、更漂亮的解决方案(请记住javascript不支持look behinds)。

假设您不支持双引号字符串中的转义,这可能会起作用:

/(?:"[^"]*"|[^,])+/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
这里有三个主要部分

第一个是匹配任何双引号字符串。这是组中的第一个,因为如果双引号字符串可能在此处匹配,则应该匹配,而不是使用非逗号规则。在此双引号字符串中,我们可以匹配任何转义字符(
\.
),它允许我们转义字符串中的双引号,或者匹配任何非双引号字符。我们一次只匹配一个字符,以便不使用非双引号字符规则捕获转义。字符串的内容使用
*
,因为双引号字符串可能为空,然后我们终止字符串

与双引号字符串不同,我们可以只匹配任何转义字符(
\\.
)。这允许我们在双引号字符串之外转义双引号字符。实际上,它还允许我们转义逗号,我不确定您是否需要。如果您不需要,此规则应改为
\[^,]

最后,如果我们不能匹配双引号字符串,也不能匹配转义符,只需匹配任何非逗号字符。这不会重复,以免以后用此规则捕获双引号或转义符


然后我们继续使用
+
修饰符重复整个模式。这允许我们一次匹配多个标记。我们使用
+
而不是
*
来避免在结果中返回空字符串。

是否可以假定您不支持转义双引号,即
测试\“,foo
应该显示为
test\
foo
?@anubhava那里没有足够的代码吗?@Kevin Ballard嗯,我可以不逃跑地生活,但结果应该是“test”和foo@RoderickObrist:哦,是的,我确实在我的评论中删除了
test
中的引号。这似乎是一个与CSV相关的问题。要进行更深入的分析,请参阅。哇,你是一个直来直去的忍者,我花了大约3个小时在这件事上,而你只用了10秒钟。你能解释一下这个解决方案背后的逻辑吗?这样我就不必再麻烦任何忍者了。@RoderickObrist:我会在一分钟内把最长的解释贴在答案里面。@RoderickObrist:我希望我的扩展解释是合适的。如果有什么不清楚的地方,请随时提问。
(?:      # 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