正则表达式拆分文本忽略引用文本中出现的定界符

Regex to split text ignoring occurrences of delimiter(s) in quoted text

如果给定一组定界符(例如 ;,,我将如何编写正则表达式,我可以在这些示例中得到以下结果:

coffee, water; tea -> [coffee, water, tea]
"coffee, black;", water; tea -> ["coffee, black;", water, tea]

澄清一下,常规文本不能有空格,引号文本可以有空格,引号内的定界符将被忽略,所有文本都由定界符分隔。

我自己一直在试验正则表达式,但没有得到我想要的结果。我也在没有 lookaheads/lookbehinds 的环境中工作。关于如何实现这一点有什么想法吗?

正在替换:

((\"[^\"]*\")|[a-zA-Z]+)[,;]

与:

,

会给你括号内的内容。

解释:

  • ((\"[^\"]*\")|[a-zA-Z]+) 这两个选项中的任何一个:
    • (\"[^\"]*\") 双引号之间的任何内容
    • [a-zA-Z]+ 任意字符序列
  • [,;] 出现任何 ,;

See on regex101,输入:

coffee, water; tea
"coffee, black;", water; tea

你得到这个输出:

coffee, water, tea
"coffee, black;", water, tea

不确定您使用的是哪种正则表达式,它排除了前瞻的使用,但是这样的东西对您有用吗?

/".*"|[^;,"\s]+/

它首先检查带引号的值(使用 ".*"),然后再尝试排除分隔符、引号和空格的值(使用负字符 class [^;,"\s]+

https://regex101.com/r/zWea28/1/

这里有一个好方法(?:\r?\n|[,;]|^)[^\S\r\n]*((?:(?:[^\S\r\n]*[^,;"\s])*(?:"[^"]*")?[^,;"\s]*))[^\S\r\n]*

添加了一些 WSp trim。
不错的演示在这里 -> https://regex101.com/r/FsJtOE/1

捕获组 1 包含该元素。
一个简单的查找应该工​​作。

注意,使用 Re2 没有断言,但是要处理所有的角
它真的需要它们。

不幸的是,这已经是您使用该正则表达式引擎所能达到的最接近的结果了。

这会做的一件事是允许在非引号字段中使用多个词。

可读版本

 # Validate even quotes:  ^[^"]*(?:"[^"]*"[^"]*)*$   
 # Then -> 
 # ----------------------------------------------
 # Find all:  

 (?: \r? \n | [,;] | ^ )
 [^\S\r\n]* 
 (                             # (1 start)
      (?:
           (?:
                [^\S\r\n]* 
                [^,;"\s] 
           )*
           (?: " [^"]* " )?
           [^,;"\s]*  
      )
 )                             # (1 end)
 [^\S\r\n]*