我有一个包含元组的字符串,如下所示:"(-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;
split
可以用于此操作,但需要更详细的表达式。
my @str = "(-0.345205479452055,1.3543),(-0.26027397260274,1.218),(-0.183561643835616,1.3028)");
my @arr1 = split(/(?<=)),(?=()/, $str);
这里的关键是使用零宽度的look-behind断言来检查关闭的paren,以及使用零宽度前瞻断言(这里不完全必要,但很有用(来检查打开的paren。查看perlre文档了解更多信息。
或者,如果您想完全避免split
,那么您也可以使用全局匹配。
my @arr2 = $str =~ /(([^)]+))/g;
如果数据的结构与显示的一致,则可以使用lookbacking检查逗号是否位于括号后面。
/(?<=)),/
你也可以使用负向后看来查看一个数字是否在逗号之前,而不是在逗号之前拆分,尽管这可能会让人难以理解。
/(?<!d),/
如果元组内没有括号,元组外也没有括号,您可以简单地使用以下正则表达式:
my @array = $str =~ /((.*?))/sg;
假设每个元组总是有一个起始括号和一个匹配的结束括号。
此处
*?
是一个非自由量词,有关更多信息,请参阅perletut- 标志
s
是一个regex修饰符,它允许.
也匹配换行符(如果您的字符串包含换行符(,请参阅perlre了解更多信息 - 标志CCD_ 10代表全局匹配并且允许匹配运算符在字符串内尽可能多次地匹配。在列表上下文中,
g
返回匹配分组的列表,或者如果没有分组,则返回整个正则表达式的匹配列表,有关详细信息,请参阅perlreput