Regex 如何匹配这些函数调用,并提取函数和第一个参数的nmae?
我试图解析一个元素数组。符合以下模式的人:Regex 如何匹配这些函数调用,并提取函数和第一个参数的nmae?,regex,perl,Regex,Perl,我试图解析一个元素数组。符合以下模式的人: Jim(“jjanson”,Customer.SALES) 我想创建一个哈希表,如Jim=>“jjanson” 我该怎么做 我无法使用: if($line=~/\s*[A-Za-z]*”(*),Customer.*\s*/)您既不匹配名称后的(),也不匹配逗号后的',“Customer.” 我可以使用以下表达式获得'jjanson': /\s*[A-Za-z]\(*"(.*), Customer.*\s*/ 但是我假设您不想要jjanson“”,所
Jim(“jjanson”,Customer.SALES)代码>
我想创建一个哈希表,如Jim=>“jjanson”
我该怎么做
我无法使用:
if($line=~/\s*[A-Za-z]*”(*),Customer.*\s*/)
您既不匹配名称后的(
),也不匹配逗号后的'
,“Customer.”
我可以使用以下表达式获得'jjanson'
:
/\s*[A-Za-z]\(*"(.*), Customer.*\s*/
但是我假设您不想要jjanson
“
”,所以我们需要这样修改它。(当我查找简单分隔的内容时,我倾向于包含负字符类。因此,在本例中,我将使用表达式“[^”]*”
另外,我尽量不依赖空格、状态或数字,我将用\s*
替换空格。您没有注意到您跳过了空格,这很好地说明了需要说“忽略一堆空格”
现在它只在有效字符中查找序列,'
+'Customer'
。从功能上讲,如果更灵活的话,也是一样的
但由于您只执行一次捕获,我看不出您将映射到什么。因此,我将自己进行映射:
my %records;
while ( my $line = $source->()) { # simply feed for a source of lines.
my ( $first, $user, $tag )
= $line = m/\s*(\p{Alpha}+)\s*\(\s*"([^"]+)",\s*Customer\.(\S+?)\)\/
;
$records{ $user }
= { first => $first
, username => $user
, tag => $tag
};
}
这远远超出了一次性快速解决方案的需要。但我喜欢尽可能多地存储我的输入。请注意,Jim(“jjanson”,Customer.SALES);
将函数调用的语法与两个参数相匹配。因此,您可能会滥用:
输出:
---
Jim: jjanson
$VAR1 = {
'Jim' => 'jjanson'
};
我不一定推荐使用这些方法,尤其是在您无法控制的输入上,以及在脚本可以访问敏感设施的情况下
另一方面,在适当的情况下,我利用这种方法将一组给定的信息转换成可以在其他地方使用的信息。尝试以下方法:
$line = 'Jim("jjanson", Customer.SALES)';
my %hashStore = (); #Jim("jjanson"
if($line=~m/^\s*([^\(\)]*)\(\"([^\"]*)\"/g) { $hashStore{$1} = $2; }
use Data::Dumper;
print Dumper \%hashStore;
输出:
---
Jim: jjanson
$VAR1 = {
'Jim' => 'jjanson'
};
您好。很抱歉,我不明白您的建议。您正在尝试提取函数的名称及其第一个参数的值。因此,我创建了一个函数以返回其第一个参数。
$line = 'Jim("jjanson", Customer.SALES)';
my %hashStore = (); #Jim("jjanson"
if($line=~m/^\s*([^\(\)]*)\(\"([^\"]*)\"/g) { $hashStore{$1} = $2; }
use Data::Dumper;
print Dumper \%hashStore;
$VAR1 = {
'Jim' => 'jjanson'
};