Regex 需要以下正则表达式的细分

Regex 需要以下正则表达式的细分,regex,regex-lookarounds,Regex,Regex Lookarounds,我很难理解下面的正则表达式是如何工作的 ,(?=([^\"]*\"[^\"]*\")*[^\"]*$) 表达式基本上匹配所有而不是括在引号中的逗号 例如: apple, banana, pineapple, "tropical fruits like mango, guava, key lime", peaches 将分为: apple banana pineapple "tropical fruits like mango, guava, key lime" peaches 有人能给我一

我很难理解下面的正则表达式是如何工作的

,(?=([^\"]*\"[^\"]*\")*[^\"]*$)
表达式基本上匹配所有而不是括在引号中的逗号

例如:

apple, banana, pineapple, "tropical fruits like mango, guava, key lime", peaches
将分为:

apple
banana
pineapple
"tropical fruits like mango, guava, key lime"
peaches
有人能给我一个很好的表达分类吗?我不明白积极的前瞻是如何起作用的。

根据:

,(?=([^\"]*\"[^\"]*\")*[^\"]*$)
(我与RegexBuddy或其作者没有任何关系。我只是该软件产品的用户。)

根据:

(我与RegexBuddy或其作者没有任何关系。我只是软件产品的用户。)

环顾四周的断言 (正向前瞻包括)是零宽度检查。他们实际上不消耗任何输入,但如果他们不满意,他们会让正则表达式引擎回溯

正向前瞻记住输入中的位置,并尝试从当前位置向右匹配。如果它不匹配,正则表达式引擎将回溯,否则它将返回到输入中记住的位置,并在前瞻之后继续

正则表达式被解构 此正则表达式使用逗号并确保其余输入匹配
([^\“]*\“[^\“]*\”*[^\“]*\”*[^\“]*$

  • [^\“]
    表示“一个字符,而不是双引号”
  • *
    表示前一个字符可以重复零次或多次
  • 括号构成一个组–它意味着“任何正好包含两个双引号的字符串,以一个双引号结尾”
  • *
    应用于该组时,它表示“任何包含偶数双引号的字符串,以一结尾”
  • 描述的“以一个[双引号]结尾”部分是个问题,您不需要这样的约束。因此,您添加了
    [^\“]*
    ,以提供非双引号字符的可能性
  • $
    匹配字符串的结尾
因此,总的来说,先行检查是否有偶数个双引号,直到逗号和逗号后的字符串。

look around断言 (包括正向前瞻)是零宽度检查。它们实际上不消耗输入中的任何内容,但如果不满意,它们会让正则表达式引擎返回

正向前瞻将记住输入中的位置,并尝试从当前位置向右匹配。如果不匹配,正则表达式引擎将回溯,否则将返回到输入中记住的位置,并在前瞻后继续

正则表达式被解构 此正则表达式使用逗号并确保其余输入匹配
([^\“]*\“[^\“]*\”*[^\“]*\”*[^\“]*$

  • [^\“]
    表示“一个字符,而不是双引号”
  • *
    表示前一个字符可以重复零次或多次
  • 括号构成一个组–它意味着“任何正好包含两个双引号的字符串,以一个双引号结尾”
  • *
    应用于该组时,它表示“任何包含偶数双引号的字符串,以一结尾”
  • 描述中的“以一个[双引号]结尾”部分有问题,您不需要这样的约束。因此您添加了
    [^\“]*
    ,以提供非双引号字符的可能性
  • $
    匹配字符串的结尾

总而言之,前瞻性检查在逗号前和逗号后是否有偶数个双引号。

如果你能直观地表示你的正则表达式,你会得到(多亏了)

您可以使用
^(([^',]+|'[^']*'.[^']*',)+$
第二个捕获组将获得您的每个元素


注意:我不知道您使用的是什么编程语言。。。这使得很难给出一个好的例子。因为我不知道你到底想配什么。如果编程语言能够将#2个组中的每一个存储在一个数组中,那么您就有了一个解决方案…

如果您能够直观地表示您将得到的正则表达式(感谢)

您可以使用
^(([^',]+|'[^']*'.[^']*',)+$
第二个捕获组将获得您的每个元素


注意:我不知道您使用的是什么编程语言。。。这使得很难给出一个好的例子。因为我不知道你到底想配什么。如果编程语言能够将#2个组中的每一个存储在一个数组中,那么您就有了一个解决方案…

您使用的是什么语言?也许我们可以提供一个更好的regexIt,让您更容易理解,而不必进行不必要的转义()。您可以使用普通的“除非这个正则表达式本身被包装在”引号中。正向前瞻意味着找到该模式并查看它后面是否有另一个模式。也有正向前瞻、负向前瞻和负向前瞻。看看这个@gtgaxiola,我会匹配它,而不是拆分字符串。这里是模式
/(“|”).?\1|[^,\s]+/s
,如果您两次转义
\1
\s
等,它应该可以在Java中工作……我添加了一个解释,说明您使用的是什么语言?也许我们可以提供一个更好的regexIt,这样您就更容易理解,而不需要不必要的转义()。您可以直接使用“除非这个正则表达式本身是用“引号”包装的。正向前看意味着找到模式并查看它后面是否有另一个模式。还有正向后看、负向前看和负向后看。看看这个@gtgaxiola,我会匹配它,而不是拆分字符串。下面是模式
/(“|”).\1|[^、\s]+/s
,如果您两次转义
\1
\s
等,它应该在Java中工作。我补充了一个解释