给出的文件包括:
const users = [
{
name: 'Jeff',
age: 52,
gender: 'male'
},
{
name: 'Andy',
age: 25,
gender: 'male'
},
{
name: 'Sarah',
age: 30,
gender: 'female'
},
{
name: 'Phoebe',
age: 21,
gender: 'female'
},
{
name: 'Doris',
age: 81,
gender: 'female'
}
];
我正在尝试匹配“具有性别的年龄是男性”,但是我不知道为什么我的代码无法与此匹配。但它适用于“ https://regex101.com/r/cO8lqs/24”
while ($line = <FILE>){
if($line =~ /age:(.*)\,\s*gender: 'male'\}/g){
print "$1\n"; #output display number only
print "$line\n";
}
}
应该这样匹配:
age: 52,
gender: 'male'
age: 25,
gender: 'male'
答案 0 :(得分:5)
您犯了一个大错误,又犯了一个小错误。
主要来说,您似乎已经忘记了<FILE>
将从文件中读取一行。而且文件中的任何一行都不会与您的正则表达式匹配。您可以通过在循环中打印$line
的值来验证这一点。
解决此问题的最简单方法是使用$/
变量。 $/
是Perl的“输入记录分隔符”。它包含Perl从文件读取时用于确定记录结尾的文本字符串。默认值为\n
(这就是<...>
一次读取一行的原因),但是我们可以对其进行更改以使其更有用。
$/ = "},\n";
现在,如果您打印$line
,您将获得更多有用的信息。
但是代码仍然不起作用。由于您的正则表达式中存在小错误。
您的正则表达式如下:
age:(.*)\,\s*gender: 'male'\}
它假定结尾}
直接在字符串male
之后。但事实并非如此-它们之间有换行符。如果您更改正则表达式以解决此问题,那么它将起作用:
age:(.*)\,\s*gender: 'male'\s*\}
您的代码现在可以使用,但是解析这样的代码非常脆弱。建议您最好删除const users =
,然后使用JSON解析器解析其余的内容。
答案 1 :(得分:0)
您也可以使用Perl-oneliner。我使用\ x27 hex来匹配单引号。检查一下
eta-expansion
或更紧凑的一个。
method