Perl соответствует определенному номеру и слову - PullRequest
0 голосов
/ 12 ноября 2018

Данный файл включает в себя:

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 голосов
/ 12 ноября 2018

Вы можете сделать это и с Perl-oneliner. Я использовал гекс \ x27 для сопоставления одинарных кавычек. Проверьте это

> perl -ne ' BEGIN {$/="}"} { print $x if /(age:(.+?).*(gender:\s\x27male\x27))/osmg and $x="$1\n" } ' const.txt
age: 52,
    gender: 'male'
age: 25,
    gender: 'male'
>

или более компактный.

> perl -ne ' BEGIN {$/="}"} { print $x if /age:.*gender:\s\x27male\x27/osmg and $x="$&\n" } ' const.txt
age: 52,
    gender: 'male'
age: 25,
    gender: 'male'
>
0 голосов
/ 12 ноября 2018

Вы допустили одну большую ошибку и одну меньшую.

В основном вы, кажется, забыли, что <FILE> будет читать одну строку из вашего файла.И ни одна из отдельных строк в вашем файле не будет соответствовать вашему регулярному выражению.Вы можете убедиться в этом, напечатав значение $line внутри цикла.

Самый простой способ исправить это - использовать переменную $/.$/ - это «входной разделитель записей» в Perl.Он содержит текстовую строку, которую Perl использует для определения конца записи при чтении из файла.Значение по умолчанию - \n (именно поэтому <...> читает строку за раз), но мы можем изменить ее, чтобы сделать ее более полезной.

$/ = "},\n";

Теперь, если вы напечатаете $line, вы получите что-то гораздо более полезное.

Но код все еще не работает.Из-за небольшой ошибки в вашем регулярном выражении.

Ваше регулярное выражение выглядит следующим образом:

age:(.*)\,\s*gender: 'male'\}

Предполагается, что закрывающий } непосредственно следует за строкой male.Но дело не в этом - между ними новая строка.Если вы измените регулярное выражение для учета этого, то оно будет работать:

age:(.*)\,\s*gender: 'male'\s*\}

Ваш код теперь работает, но подобный синтаксический анализ довольно хрупок.Возможно, вам лучше посоветовать удалить const users =, а затем проанализировать все остальное, используя JSON-анализатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...