Как исключить разрыв строки из класса символов регулярных выражений? - PullRequest
0 голосов
/ 24 апреля 2011

Учитывая этот шаблон PCRE:

/(<name>[^<>]*<\/name>[^<>]*<phone>[^<>]*<\/phone>)/

И этот текст темы:

<name>John Stevens</name>  <phone>888-555-1212</phone>
<name>Peter Wilson</name>  
<phone>888-555-2424</phone>

Как я могу получить регулярное выражение, чтобы соответствовать первой паре имя-телефон, но не второй?Я не хочу сопоставлять пары, разделенные переносами строк.Я попытался включить конец строки в класс отрицанных символов, например [^<>$]*, но ничего не изменилось.

Вы можете использовать следующие онлайн-инструменты для проверки своих выражений:
http://rubular.com/
http://www.regextester.com/
Спасибо.

Ответы [ 3 ]

3 голосов
/ 24 апреля 2011

Я думаю, что это сработает

/<name>[^<>]*<\/name>[^<>\r\n]*<phone>[^<>]*<\/phone>/

Что бы вы ни указали в классе [ ], это должно быть нечто, представляющее один символ.$ интерпретируется как литерал $ внутри класса, возможно потому, что $ как конец строки имеет ширину 0 и не может быть интерпретирован как таковой внутри класса.(Отредактировано после комментария ridgerunner)

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

1 голос
/ 24 апреля 2011

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

/(<name>[^<>]*<\/name>.*?<phone>[^<>]*<\/phone>)/

Соответствует только имени, телефонной паре, поскольку точка . не будет соответствовать EOL, но [^<>] будет соответствовать.

Проверено на http://rubular.com/r/amXvq20sl8

0 голосов
/ 24 апреля 2011

Эти сайты не поддерживают весь синтаксис PCRE. Я использовал этот сайт: http://lumadis.be/regex/test_regex.php

И это сработало:

/^(<name>[^<>]*<\/name>[^<>$]*<phone>[^<>]*<\/phone>)/

/(?-s)(<name>[^<>]*<\/name>.*<phone>[^<>]*<\/phone>)/

наверное лучше

...