我正在尝试仅在字符串上应用拆分函数,其中 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 美元或可以递归完成的东西。
任何帮助将不胜感激
也许矫枉过正,但我会使用
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
您可以使用环顾四周的断言,即在分号之前或后面不带分号的分号上拆分:
#!/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 );
这个应该做这项工作::(?=~)
演示