2013-05-20 5 views
0

У меня есть скрипт Perl, который выполняет регулярное выражение для поиска метки разметки (<tag>).Perl end-of-line regex

Мои регулярные выражения: <tag([^>]+)>

Это работает для большинства intances, однако, я нашел один случай, когда он не работает.

Если <tag> имеет следующее образование ....

<tag 
attr="12345"> 

Регулярное выражение работает отлично.

Однако, если <tag> выглядит следующим образом.

<tag attr="12345" 
> 

Нет совпадений. Я тестировал свое регулярное выражение Notepad ++, и он отлично работает для всех экземпляров. Проблема в моем скрипте Perl.

Я попытался использовать несколько концевых якорей, но пока не повезло. Любая помощь высоко ценится!

Отредактировано Это моя строка кода.

$line =~s/<tag([^>]+)>/<!--tag $1-->/g; 
+0

Не уверен, что проблема с регулярным выражением. Я пробовал: '$ perl -e 'if (<>. <> = ~/] +)> /) {print" yes \ n "}' yes ' и он работает. Возможно, вам нужно показать больше кода (возможно, небольшую программу воспроизведения). – ctn

+0

Работает для меня: 'my $ s = qq (); $ s = ~/] +)>/и печатать $ 1; 'дает' attr = "12345" '. – choroba

+0

Добавил мою строку кода. – Jeff

ответ

0

Вы вызываете строку для управления $line. Это подозрительно, потому что раньше вы должны были конкатенировать несколько строк, чтобы проверить многострочные теги. Пожалуйста, проверьте (или опубликуйте), что вы тоже конкатенируете код. Я на 90% уверен, что проблема есть.

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

<tag foo="1">foo bar <tag bar="2">baz spam 

Станет

<!--tag foo="1">foo bar <tag bar="2"-->baz spam 

после вашего лечения, хотя вы, вероятно, хотел

<!-- tag foo="1"-->foo bar <!--tag bar="2"-->baz spam 

Используйте ленивую версию + квантора: +?.

$line = ~s/<tag([^>]+?)>/<!--tag $1-->/g;