繁体   English   中英

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

[英]Javascript method to split string on unquoted comma

你会认为这个问题之前已被问过,但我找不到它。

我需要用未引用的逗号分隔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不支持外观)。

假设你不支持双引号字符串中的转义,这应该可行:

/(?:"[^"]*"|[^,])+/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

这里有三个主要组件。

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

我们可能只匹配任何转义字符( \\\\. ),而不是双引号字符串。 这使我们可以在双引号字符串之外转义双引号字符。 它实际上让我们也逃脱了逗号,我不确定你是否想要。 如果您不想要它,则此规则应转换为\\\\[^,]

最后,如果我们在这里不能匹配双引号字符串,并且我们无法匹配转义符,则只匹配任何非逗号字符。 这不会重复,以免后来用这个规则捕获双引号或转义。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM