我有一个逗号分隔的元组作为输入。每个元组包含三个由逗号分隔的元素:number、text和number。每个元素都可以不存在(空字符串)。
文本可以用引号括起来,但如果文本中有逗号或空格,则可以选择将其括起来。输入示例:
(1,Item1,1),(,"Item 2",2),(3,"With,comma",3)
有没有可能写一个正则表达式来从元组中获取元素?
我的一个尝试是下一个\((.*?),"?(.*?)"?,(.*?)\)
,但它在文本中有逗号的元组上失败了。
下面是我测试它的地方:regex101.com/r/2RetnU/1
1条答案
按热度按时间lpwwtiir1#
Tuple1 = \1
、Tuple2 = \2
、Tuple3 = \5
测试日期:
因为(为了进一步处理)你需要知道你是否有一个转义字符串,非转义字符串包括双引号。
,
1.要成为一组元组,字符串要求这些字符按以下顺序出现:
(,,)
,中间可能有更多字符。1.捕捉元组1和3中的数字是很简单的:
\d*
1.作为字符串的元组2分成2个变体:
1.转义字符串:
([^()",]|\\[(),"])*
字符串中不允许出现 meta字符
,()"
,除非有一个前导的\
转义字符。1.引用字符串:
"([^"]|\\")*"
这里只有
"
双引号是一个 meta字符,只能显示为转义。\
的转义是不需要的,因为元组定义足够严格,除了有一个非常特殊的,对于多个元组的元组集语法错误的构造。接受这一点,RegEx对一些逃逸错误(如
(1,"\",3)
或(1,unquoted\,3)
)是健壮的,但对元组集 backbone 中的错误敏感。由于没有边缘检测
^ ... $
,如果\n
不用作定界符,则正则表达式将遍历多行。