我试图在字符串上应用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个值my @result_array= split(/[^:][:][^:]/g, $example_string )
@result_array = [
'_targetfund|tes',
'rowcountmax|10',
'test|YE',
'fruit|appl',
'date|\'12/31/2016\''
];
我正在玩https://regex101.com/,认为可能有一种方法可以在同一个正则表达式中返回$ 1或者可以递归地执行某些操作。
任何帮助将不胜感激
答案 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)
这个应该做的工作::(?=~)
答案 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