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

标签 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',
 '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

这里有三个主要组成部分。

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

我们可以只匹配任何转义字符 (\\.) 而不是双引号字符串。这让我们可以在双引号字符串之外转义双引号字符。它实际上也让我们转义逗号,我不确定你是否想要。如果你不想要它,这个规则应该变成 \\[^,] 而不是。

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

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

关于在不带引号的逗号上拆分字符串的Javascript方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9609973/

相关文章:

javascript - 在 angularjs 中注册服务(使用 typescript )

javascript - 在 Javascript 中可以选择字符串中的单词吗?

php - Javascript 正则表达式并获取所有匹配项,它类似于 preg_match_all(PHP)

java - 在replaceAll中以编程方式获取捕获组

python - 需要深入了解为什么我的 Python 函数没有对字符串进行正确的比较

string - 如何从字符串中删除最后 4 个字符?

javascript - 从父级溢出 :scroll 中弹出子级

javascript - TypeError : data. 过滤器不是函数

正则表达式 BNF 语法

javascript - 如何改进我的 JSON 架构?