Regex Perl-使用正则表达式拆分包含元组的字符串

Regex Perl-使用正则表达式拆分包含元组的字符串,regex,perl,split,Regex,Perl,Split,我有一个包含元组的字符串,如下所示: “(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)” 我试图将此字符串拆分为一个仅包含元组的数组:[(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)] 我不能像下面那样使用Split函数,因为该函数也会拆分元组。有没有一个正则表达式或

我有一个包含元组的字符串,如下所示:
“(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)”

我试图将此字符串拆分为一个仅包含元组的数组:
[(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)]

我不能像下面那样使用
Split
函数,因为该函数也会拆分元组。有没有一个正则表达式或者一些聪明的方法可以让元组保持原样


@Tuples=split/,/,$myString

如果元组内没有括号,元组外也没有括号,则可以简单地使用以下正则表达式:

my @array = $str =~ /(\(.*?\))/sg;
假设每个元组始终有一个起始括号和一个匹配的结束括号

这里

  • *?
    是一个非语法量词,请参阅以了解更多信息
  • 标志
    s
    是一个正则表达式修饰符,它允许
    也匹配换行符(如果字符串包含换行符),有关详细信息,请参阅
  • 标志
    g
    表示全局匹配,并允许匹配运算符在字符串内尽可能多次匹配。 在列表上下文中,
    g
    返回匹配分组的列表,如果没有分组,则返回整个regexp的匹配列表,有关详细信息,请参阅

如果您的数据结构与显示的一致,您可以使用lookback检查并查看逗号是否位于括号后

/(?<=\)),/
/(?可用于此,但需要更详细的表达式

my @str = "(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)");
my @arr1 = split(/(?<=\)),(?=\()/, $str);

关于
my@array=$str=~/(\(.*?)/sg
?非常感谢!。它很有效。是的,元组中没有偏执。如果你不介意的话,你能解释一下代码吗。你已经使用了捕获组((.*))捕获元组。每个捕获的标量是如何进入数组的?不客气,我已经更新了这个问题,解释了匹配项将如何进入数组。
my @str = "(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)");
my @arr1 = split(/(?<=\)),(?=\()/, $str);
my @arr2 = $str =~ /(\([^)]+\))/g;