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



我有一个包含元组的字符串,如下所示:"(-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

最新更新