正则表达式拆分文本忽略引用文本中出现的定界符
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]+
)
这里有一个好方法(?:\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]*
如果给定一组定界符(例如 ;
和 ,
,我将如何编写正则表达式,我可以在这些示例中得到以下结果:
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]+
)
这里有一个好方法(?:\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]*