perl匹配特定的数字和单词

时间:2018-11-12 11:03:55

标签: perl

给出的文件包括:

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'

2 个答案:

答案 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