2013-11-07 3 views
0

У меня есть текстовый файл, похожий на следующий.Perl regex для соответствия метасимволам

Jack  Boy 
Jill  Girl 
Jam  ???? 
John  Boy 
Michelle Girl 

Я написал это, который я намеревался соответствовать только те строки, которые содержат два слова, а не линии Jam ????. Это не работает.

if ($line =~ (/(\w+)\s+(\w+)/) && !(m/\?\?\?\?/)) 
+0

Это полная сложность файла данных и ваше требование? Почему ваше регулярное выражение захватывает слова? – Borodin

+1

как это не работает? – ysth

+1

Это как 'if ($ answer eq 'yes' или 'no') {...}'. Надеюсь, ты видишь свою ошибку? – Borodin

ответ

0

Я не вижу никакой необходимости, чтобы соответствовать метасимволам для конкретного ввода:

use warnings; 
use strict; 

while (<DATA>) { 
    print if /(\w+)\s+(\w+)/; 
} 

__DATA__ 
Jack  Boy 
Jill  Girl 
Jam  ???? 
John  Boy 
Michelle Girl 
1

Является ли эта только два варианта: два слова или слово и ?????

Если это так, первой части /(\w)+\s+(\w+)/ достаточно.

\w не соответствует ?.

2

Если вы также являетесь обработки данных, то регулярное выражение является неправильным инструментом для этого.

Вы должны просто разделить каждую строку на поля и проверить, не содержит ли второе поле ничего, кроме вопросительных знаков.

Как это

use strict; 
use warnings; 

while (my $line = <DATA>) { 
    my @fields = split ' ', $line; 
    next unless $fields[1] =~ /[^?]/; 
    print $line; 
} 

__DATA__ 
Jack  Boy 
Jill  Girl 
Jam  ???? 
John  Boy 
Michelle Girl 

выход покрыли

Jack  Boy 
Jill  Girl 
John  Boy 
Michelle Girl 
0

Предыдущие ответы, что это на самом деле не правильный процесс, но иногда фильтрации строк с помощью регулярных выражений является полезным в одном случае заявление.

У вас его почти не было! Во второй половине оператора if отсутствует соответствующий оператор.

if ($line =~ (/(\w+)\s+(\w+)/) && !($line =~ m/\?\?\?\?/))

+0

Существует ответ, в котором говорится именно об этом. Автор удалил его. В каком случае вы могли бы предложить это вместо «split»? – Borodin

+2

Нет. 'split' - это правильный способ справиться с этим. Вот почему я поддержал ваш ответ. Я просто хотел внести минимальные изменения, чтобы ОП мог понять, почему исходный код не работает. –

Смежные вопросы