regex 正则表达式,可选地捕获所有引号内的内容

jfewjypa  于 2023-04-22  发布在  其他
关注(0)|答案(1)|浏览(106)

我有一个逗号分隔的元组作为输入。每个元组包含三个由逗号分隔的元素:number、text和number。每个元素都可以不存在(空字符串)。
文本可以用引号括起来,但如果文本中有逗号或空格,则可以选择将其括起来。输入示例:

(1,Item1,1),(,"Item 2",2),(3,"With,comma",3)

有没有可能写一个正则表达式来从元组中获取元素?
我的一个尝试是下一个\((.*?),"?(.*?)"?,(.*?)\),但它在文本中有逗号的元组上失败了。
下面是我测试它的地方:regex101.com/r/2RetnU/1

lpwwtiir

lpwwtiir1#

\((\d*),(([^()",]|\\[(),"])*|"([^"]|\\")*"),(\d*)\)

Tuple1 = \1Tuple2 = \2Tuple3 = \5
测试日期:

(1,"Item(with\"escaped\"quotes and(parentheses)",3),(2,escaped\, non-

\"quoted\" text \, separated and with \(parentheses\)
,88),(1,Item1,1),(,"Item 2",2),(3,"With,comma",3),
(23,Item1\, Item2\,\"Item 3\",99),(2,,88),(,,)
  • 这个RegEx考虑了字符串元组被转义或用双引号括起来的可能性。

因为(为了进一步处理)你需要知道你是否有一个转义字符串,非转义字符串包括双引号。

  • 它要求最小元组(全部为空)包含分隔符,

1.要成为一组元组,字符串要求这些字符按以下顺序出现:(,,),中间可能有更多字符。
1.捕捉元组1和3中的数字是很简单的:\d*
1.作为字符串的元组2分成2个变体:
1.转义字符串:([^()",]|\\[(),"])*
字符串中不允许出现 meta字符,()",除非有一个前导的\转义字符。
1.引用字符串:"([^"]|\\")*"
这里只有"双引号是一个 meta字符,只能显示为转义。

  1. meta字符\的转义是不需要的,因为元组定义足够严格,除了有一个非常特殊的,对于多个元组的元组集语法错误的构造。
    接受这一点,RegEx对一些逃逸错误(如(1,"\",3)(1,unquoted\,3))是健壮的,但对元组集 backbone 中的错误敏感。
    由于没有边缘检测^ ... $,如果\n不用作定界符,则正则表达式将遍历多行。

相关问题