2013-09-06 4 views
0

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

. 
. 
th>Di, -12 ;0907<th 
th>Mi, -44 ;1007<th 
th>Do, -66 ;1107<th 
. 
. 

Мой Perl скрипт:

. 
. 
my (@d,$h,$s); 
@d=$h=~/(th>(Di|Mi|Do), -\d\d ;\d\d\d\d<th)/igs; 
foreach $s (@d) 
    {print "$s\n";}; 

Output is: 
th>Di, -12 ;0907<th 
Di 
th>Mi, -44 ;1007<th 
Mi 
th>Do, -66 ;1107<th 
Do 

Моя проблема, мне нужен этот вывод:

th>Di, -12 ;0907<th 
th>Mi, -44 ;1007<th 
th>Do, -66 ;1107<th 

Как фильтровать совпадения без чередования в регулярном выражении?

+1

Просьба пояснить. Ваш «Выход» выглядит равным «Мне нужен этот вывод» ... если его буквально о «Ди, Ми, До» в отдельной строке исключить это из группы совпадений с помощью оператора '?:': '/ (th> (: Di | Mi | Do), - \ d \ d; \ d \ d \ d \ d dognose

+0

Ваш код неверен. Переменная '$ h' не определена при использовании в регулярном выражении. Я знаю, что он содержит, но может быть запутан для всех, кто копирует и вставляет ваш код, пытаясь помочь. – Birei

+0

Благодарим вас за помощь. В следующий раз я буду более точно. – Schnulli

ответ

4

Ну, проще всего было бы просто превратить захват группы в не-захвате один с оператором ?: регулярных выражений:

@d=$h=~/(th>(?:Di|Mi|Do), -\d\d ;\d\d\d\d<th)/igs; 

На самом деле, ?: часто используются с |: ограничить объем чередования, в вы должны использовать круглые скобки, но вам не нужно также использовать их основной эффект (захват).

+0

Это решило мою проблему. Спасибо за вашу быструю помощь! – Schnulli

1

Если вы знаете, что данные имеют одинаковое количество цифр в следующих строках, вы могли бы сделать ..

(th>(?:Di|Mi|Do),\s+-\d{2}\s+;\d{4}<th) 

Если длина вашего номера различаются, то я хотел бы сделать.

(th>(?:Di|Mi|Do),\s+-\d+\s+;\d+<th) 

Вместо того, чтобы использовать пространство в своем регулярном выражении, используйте \s:

\s+   matches whitespace (\n, \r, \t, \f, and " ") (1 or more times) 

Причина в том, если данные имеют более одного места, то регулярное выражение не будет соответствовать следующее:

th>Di, -12 ;0907<th 
th>Mi, -44 ;1007<th 
+0

Спасибо - также за ваш дополнительный намек. – Schnulli

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