使用ref验证perl构造函数中的初始化变量

时间:2017-04-13 21:59:53

标签: regex perl regex-negation regex-group

我试图在字符串上应用split函数,只有在使用正则表达式存在1冒号(:)的情况下。问题是虽然冒号可以连续多次存在,但我只对结肠没有先于或后面跟着另一个冒号的情况感兴趣。任何其他角色都可以在冒号之前或之后。

示例字符串:

my $example_string = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}"

预期结果:

my @result_array = ["_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}"];

到目前为止,我所尝试的是否定和群体正则表达的结合......让我走近的一个例子:

  1. 在冒号

    之前和之后切掉1个值
    my @result_array= split(/[^:][:][^:]/g, $example_string )
    
    @result_array = [
        '_targetfund|tes',
        'rowcountmax|10',
        'test|YE',
        'fruit|appl',
        'date|\'12/31/2016\''
    ];
    
  2. 我正在玩https://regex101.com/,认为可能有一种方法可以在同一个正则表达式中返回$ 1或者可以递归地执行某些操作。

    任何帮助将不胜感激

3 个答案:

答案 0 :(得分:1)

你可以使用环顾四周的断言,即分号前面没有分号,后面跟分号:

#!/usr/bin/perl
use warnings;
use strict;

use Test::Deep;

my $example_string = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}";

my $result_array = ["_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}"];

cmp_deeply( [ split /(?<!:):(?!:)/, $example_string ], $result_array );

答案 1 :(得分:1)

这个应该做的工作::(?=~)

Demo

答案 2 :(得分:1)

也许是矫枉过正,但我​​会使用

split /(?<!:):(?!:)/, $str;

演示

use 5.014;
use warnings;
use Test::More;

my $str = "_Fruit|Apple:~Vegetable|Carrot:~fruitfunc|Package::User::Today:~datefunct|{~date}";
my @wanted = ("_Fruit|Apple","~Vegetable|Carrot","~fruitfunc|Package::User::Today","~datefunct|{~date}");

my @arr = split /(?<!:):(?!:)/, $str;
is_deeply(\@arr, \@wanted);
done_testing(1);

#ok 1
#1..1