Что нового

Почему регулярное выражение не работает?

mef-t

Осваивающий
Сообщения
306
Репутация
30
Добрый день.

Имеется регулярное выражение
Код:
href\s*=\s*(?:["'](?<1>[^"']*)["']|(?<1>\S+))
Взято тут:
http://msdn.microsoft.com/ru-ru/library/t9e807fx.aspx

Не работает.

При этом если задавать частями, то все работает. Например:
Код:
href\s*=\s*(?:["'](?<1>[^"']*)["'])
или
Код:
(?<1>\S+)

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

Просьба помочь разобраться

P.S. Для примера анализа взяты исходники страницы www.urban-rivals.com
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Re: Регулярное выражение от msdn не работает

Предупреждение За нарушение правил форума (пункт Б.5):
Имя темы должно нести смысловую нагрузку (отражать суть вопроса/проблемы)
Правильно сформулированное название темы привлекает больше внимания, и шансы получить конкретный ответ увеличиваются.


Данные правила могут пополняться локальными правилами раздела.
Как правильно называть темы

"Регулярное выражение от msdn не работает" - это неприемлемое название темы, переименуйте тему иначе она будет закрыта, а вам возможно будет выдан бан на несколько дней.

С уважением, ваш Модератор.











Добавлено:
Сообщение автоматически объединено:

Суть вашего вопроса в чём?
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
mef-t [?]
При этом если задавать частями, то все работает.
Если работает, в чём вопрос? Не указано что нужно получить. В рамках любого выражения можно сказать что оно работает, ведь оно что-то получает или не получает если этого нет, соответственно работает. Другое дело если имеется результат который необходимо добится, тогда можно сказать что оно не работает если вывод не совпадает с затребованным. Итак с чем нам сравнивать, чтобы сказать работает оно или нет.
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
Указанное выражение не возвращает результатов.
К примеру не возвращает результата для строки:
Код:
href="http://autoit-script.ru/Themes/RuNet/style.css?rc1"

Почему?
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
Очевидно что проблема во вложенных условных шаблонах.
Вот так работает
Код:
"href\s*=\s*(?:[""'](?<1>[^""']*)[""']|\S+)"

Redline в своём мануале отмечал что не всё так гладко с условными масками. Наверняка вложенные условные маски - это ещё одни грабли.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
mef-t,
Мутный у тебя шаблон какой-то...
Зачем эти условиные маски с condition всегда 1?
Почему не так
Код:
"href\s*=\s*[""']([^""']*)(?:[""']|\S+)"
?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
C2H5OH [?]
Кстати это не совсем корректное выражение для поиска ссылка у href, вот пример где это не сработает:
Код:
$vTest = '<a href="http://test.com/it''s_my_page">test</a>'

на выходе получим http://test.com/it.

Вот вроде рабочий вариант:
Код:
$vTest = '<a href="http://test.com/it''s_my_page">test</a>'
;$vTest = "<a href='http://test.com/it""s_my_page'>test</a>"
;$vTest = "<a href=http://test.com/it""s_my_page>test</a>"

$sRet = StringRegExp($vTest, 'href\s*=\s*([''"])?([^\1\s]+?)(?:\1|>)', 3)

If UBound($sRet) > 1 Then
	ConsoleWrite($sRet[1] & @LF)
EndIf
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
mef-t [?]
Указанное выражение не возвращает результатов.
У меня оно даже выдавало ошибку регулярного выражения. Может там используется другой движок.
 

C2H5OH

AutoIT Гуру
Сообщения
1,473
Репутация
333
У меня оно даже выдавало ошибку регулярного выражения. Может там используется другой движок.
Ошибку выдавало, наверное, потому что ТС шаблон посокращал. Взял он его по ссылке, которую выложил, но кавычки ему показались лишними и он их повыбрасывал...
 

ivsatel

Продвинутый
Сообщения
319
Репутация
84
Руководствуясь справкой http://autoit-script.ru/autoit3_docs/functions/StringRegExp.htm
Использовал предоставленный по ссылке шаблон:
Код:
href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>\S+))

В такой вариации:
Код:
#include <Array.au3>

$sText = BinaryToString(InetRead('http://www.autoitscript.com/site/autoit/', 1))

$aRez = StringRegExp($sText, "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?<1>\S+))", 3)

If @error Then
	MsgBox('','', @extended)
EndIf

_ArrayDisplay($aRez, UBound($aRez)-1)

Выдает сообщение о позиции ошибочного символа в регулярном выражении. Эта позиция 40. В данном шаблоне это знак ?
Если использовать перед после 40-го символа двоеточие, то отрабатывает нормально.
Тут я понимаю так. В этом шаблоне получается две группы захвата ?
Т.е. если выставить перед после 40-го символа двоеточие то мы оставляем одну группу захвата и шаблон вполне работоспособен.
Вот так:
Код:
#include <Array.au3>

$sText = BinaryToString(InetRead('http://www.autoitscript.com/site/autoit/', 1))

$aRez = StringRegExp($sText, "href\s*=\s*(?:[""'](?<1>[^""']*)[""']|(?:<1>\S+))", 3)

If @error Then
	MsgBox('','', @extended)
EndIf

_ArrayDisplay($aRez, UBound($aRez)-1)

Я правильно понимаю, что не может быть в одном шаблоне двух групп захвата?
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
AZJIO, C2H5OH, ivsatel

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


Вероятно потому, что Вы все засунули в одни кавычки. Следующий вариант в коде использовать не стоит (ниже вариант)
Код:
'href\s*=\s*([''"])?([^\1\s]+?)(?:\1|>)'

Вылетает часть строки, так как в записи есть одинарные и двойные кавычки.

Вместо него следует использовать такой подход
Код:
$strnigRegExp = '<a[^>]*href\s*=\s*(?:["' & "'](?<1>[^" & '"' & "']*)[" & '"' & "']|\S+)"

Прошу прощения, тут вариант немного дополнен вначале, но суть, думаю, понятна

P.S. думаю, так же можно воспользоваться экранирующими знаками, чтобы учесть всю строку полностью.

P.P.S. ошибка не обязательно должна появляться, и записывать все одной строкой не обязательно не правильно. Все зависит от интерпретатора (надеюсь я использовал верный термин). У меня при первой же одинарной кавычке (если строка ограничена одинарными кавычками) вся последующая запись не является строкой, и потому сообщения. Но если правильно настроить интерпретатор то такого может и не быть.
P.P.P.S. Кавычки из шаблона я не выбрасывал. Если что-то выбросил, просьба указать, какие. Исправлю. Хотя уже раз 5 проверил.


Добавлено:
Сообщение автоматически объединено:

CreatoR
По приведенному примеру согласен.
Но он у меня встречался куда реже, чем другие примеры, которые не попадали в найденные примеры.
Даже пример из справки не все ссылки обрабатывает.

Бывают ссылки, где нет "http":
Код:
<a href="/s_my_page/">my page</a>

Бывают ссылки, где "href" - не единственный параметр:
Код:
<a id="forgotPass" href="/s_my_page/">my page</a>

И прочее..

Таким образом этот вариант подошел мне больше хотя бы потому, что собирал больше ссылок.

Но в любом случае большое спасибо. Учту и попытаюсь решить.
 

AZJIO

Меценат
Меценат
Сообщения
2,874
Репутация
1,194
mef-t [?]
потому, что Вы все засунули в одни кавычки
Я использую свою программу RegExp, там по барабану сколько кавычек, потому что не используется форматирование внутри кода, а используется чтение Input. Во вторых RegExp показал позицию ошибки и символ ошибки. Но я разбираться не стал, потому что сам могу составить рег.выр. если знать что требуется. А для таких ТЗ только трата времени, после часа тестирования автор ТЗ обычно заявляет, что ему нужно в общем извлечь ссылки, а это не работает так как надо и заново приходится переделывать ещё в течении часа, а я своё время берегу и не делаю холостых ходов.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
AZJIO [?]
для таких ТЗ только трата времени

Поэтому я писал:
Garrett [?]
Суть вашего вопроса в чём?

Получил ответ:
mef-t [?]
разобраться в причине, по которой не работает регулярное выражение
Тут совет один, учить матчасть. :smile:
 
Автор
mef-t

mef-t

Осваивающий
Сообщения
306
Репутация
30
А я уже получил ответ.
И даже пометил тему как решенную.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
mef-t [?]
Таким образом этот вариант подошел мне больше хотя бы потому, что собирал больше ссылок.
В моём шаблоне нет привязки к числу параметров, впрочем как и к http :smile:.
 
Верх