Perl-使用正则表达式

时间:2018-08-07 19:57:35

标签: 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函数,因为该函数还会拆分元组。是否有正则表达式或一些聪明的方法可以照常获取元组?

@Tuples = split /,/,$myString;

3 个答案:

答案 0 :(得分:3)

split可以用于此目的,但需要更详细的表达方式。

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

此处的关键是使用零宽度后向断言来检查闭合括号,并使用零宽度前瞻性断言(这里并不是完全必要,但很有用)来检查打开paren。查看perlre文档以获取有关这些信息的更多信息。

或者,如果您想完全避免使用split,那么也可以使用全局匹配。

my @arr2 = $str =~ /(\([^)]+\))/g;

答案 1 :(得分:1)

如果数据的结构与显示的方式一致,则可以使用后向检查来检查逗号是否在括号后。

/(?<=\)),/

您还可以在后面使用负号,以查看数字是否在逗号前,而不是在逗号前分开,尽管这可能会使您难以理解。

/(?<!\d),/

答案 2 :(得分:0)

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

my @array = $str =~ /(\(.*?\))/sg;

假定每个元组始终有一个起始括号和一个匹配的结束括号。

这里

  • *?是一个非贪婪的量词,有关更多信息,请参见perlretut
  • 标志s是一个正则表达式修饰符,可让.也匹配换行符(如果您的字符串包含换行符),有关更多信息,请参见perlre
  • 标志g代表全局匹配,并允许匹配运算符在一个字符串内尽可能多地匹配。 在列表上下文中,g返回匹配的分组列表,或者如果没有分组,则返回与整个正则表达式匹配的列表,有关更多信息,请参见perlretut