cod*_*ero 0 regex perl eval subroutine
我有一些我在Perl中解析的数据,并且将在不久的将来添加越来越多不同格式的数据.我想要做的是编写一个易于使用的函数,我可以传递一个字符串和一个正则表达式,它将返回括号中的任何内容.它会像这样工作(伪代码):
sub parse {
$data = shift;
$regex = shift;
$data =~ eval ("m/$regex/")
foreach $x ($1...$n)
{
push (@ra, $x);
}
return \@ra;
}
Run Code Online (Sandbox Code Playgroud)
然后,我可以这样称呼它:
@subs = parse ($data, '^"([0-9]+)",([^:]*):(\W+):([A-Z]{3}[0-9]{5}),ID=([0-9]+)');
Run Code Online (Sandbox Code Playgroud)
如您所见,此代码存在一些问题.我不知道eval是否会起作用,'foreach'肯定不会起作用,而且不知道有多少括号,我不知道循环多少次.
这对于拆分来说太复杂了,所以如果还有其他功能或可能性我忽视,请告诉我.
谢谢你的帮助!
在列表上下文中,正则表达式将返回所有带括号的匹配项的列表.
所以你要做的就是:
my @matches = $string =~ /regex (with) (parens)/;
Run Code Online (Sandbox Code Playgroud)
并且假设它匹配,@matches将是两个捕获组的数组.
所以使用你的正则表达式:
my @subs = $data =~ /^"([0-9]+)",([^:]*):(\W+):([A-Z]{3}[0-9]{5}),ID=([0-9]+)/;
Run Code Online (Sandbox Code Playgroud)
此外,当你有很长的正则表达式时,Perl有一个x修饰符,它在结束正则表达式分隔符之后.该x修改允许你把空格和换行正则表达式增加可读性内.
如果您担心可能长度为零的捕获组,则可以通过匹配@subs = grep {length} @subs来过滤掉它们.