Что нового

Описать исключение в группе с захватом

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
Всем доброго времени суток...
Есть вот такая наработочка:
Код:
#include <array.au3>
$myPattern = '(?si)st3[^6].*?">(.*?)</TD>'

$Text = '<TD class="st35" style="border-top-color:black; border-left-color:black; border-top-width:0pt; border-left-width:0pt">01.01.2012</TD>' & @CRLF & _
'<TD class="st35" style="border-top-color:black; border-top-width:0pt">00:45:44</TD>' & @CRLF & _
'<TD class="st35" style="border-top-color:black; border-top-width:0pt">89008007060</TD>' & @CRLF & _
'<TD class="st35" style="border-top-color:black; border-top-width:0pt">g</TD>' & @CRLF & _
'<TD class="st36" style="border-top-color:black; border-top-width:0pt">Мегафон, Поволжский регион</TD>' & @CRLF & _
'<TD class="st35" style="border-top-color:black; border-top-width:0pt"></TD>' & @CRLF & _
'<TD class="st37" style="border-top-color:black; border-top-width:0pt">sms o</TD>' & @CRLF & _
'<TD class="st35" style="border-top-color:black; border-top-width:0pt"></TD>' & @CRLF & _
'<TD class="st38" style="border-top-color:black; border-top-width:0pt">1</TD>' & @CRLF & _
'<TD class="st38" style="border-top-color:black; border-right-color:black; border-top-width:0pt; border-right-width:0pt">1.65 </TD>'

$sReg = StringRegExp($Text, $myPattern, 3)
_ArrayDisplay($sReg)

Которая в принципе реализует то что нужно, но как всегда есть "но", да и хочется пользуясь случаем разобраться до конца.
Во-первых я никак не пойму как мне исключить из группы с захватом пустые решения, которые возникают из-за пустых тегов удовлетворяющих условию.
Во вторых я бы хотел добавить в группу с захватом еще одно условие - результат не должен быть "g"...
Я пробую так '(?si)st3[^6].*?">([^g].*?)</TD>' в итоге получаю совсем неожиданный эффект, в массив не попадают пустые значения, причем здесь [^g] ? и более того в массив в некоторых местах набираться значения которые вообще шаблону не удовлетворяют, вернее самому шаблону, а не группе с захватом.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
RUVATA,
Не знаю, правильно ли, но у меня работает.
Код:
#include <Array.au3>

$Text = '<TD class="st35" style="border-top-color:black; border-left-color:black; border-top-width:0pt; border-left-width:0pt">01.01.2012</TD>' & @CRLF & _
		'<TD class="st35" style="border-top-color:black; border-top-width:0pt">00:45:44</TD>' & @CRLF & _
		'<TD class="st35" style="border-top-color:black; border-top-width:0pt">89008007060</TD>' & @CRLF & _
		'<TD class="st35" style="border-top-color:black; border-top-width:0pt">g</TD>' & @CRLF & _
		'<TD class="st36" style="border-top-color:black; border-top-width:0pt">Мегафон, Поволжский регион</TD>' & @CRLF & _
		'<TD class="st35" style="border-top-color:black; border-top-width:0pt"></TD>' & @CRLF & _
		'<TD class="st37" style="border-top-color:black; border-top-width:0pt">sms o</TD>' & @CRLF & _
		'<TD class="st35" style="border-top-color:black; border-top-width:0pt"></TD>' & @CRLF & _
		'<TD class="st38" style="border-top-color:black; border-top-width:0pt">1</TD>' & @CRLF & _
		'<TD class="st3a" style="border-top-color:black; border-top-width:0pt">2</TD>' & @CRLF & _;;;добавил 3 и не цифру
		'<TD class="st38" style="border-top-color:black; border-right-color:black; border-top-width:0pt; border-right-width:0pt">1.65 </TD>'

$myPattern = '(?i)st3[0-57-9].*?>([^g</]{1,}?)</TD>'

$sReg = StringRegExp($Text, $myPattern, 3)
_ArrayDisplay($sReg)
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
madmasles, это действительно то что нужно
:-[ хотелось бы попросить прокоментировать вот этот момент:
(?i)st3[0-57-9].*?>([^g</]{1,}?)</TD>'
описать что же все таки здесь происходит ?

PS:
Вы заменили мою конструкцию (?i)st3[^6].*?>([^g</]{1,}?)</TD>
на (?i)st3[0-57-9].*?>([^g</]{1,}?)</TD>
Есть ли в этом скрытый смысл, или Вам просто так удобней/привычнее?
так как эти две конструкции вроде как в данном контексте идентичны,
ну кроме того что у вас условие ограничено в принципе - цифрами.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
RUVATA [?]
Любые символы кроме тех, которые в кв.скобках, не менее одного.
Вы заменили мою конструкцию
Специально в текст добавил строку с (...class="st3a" style=...), Ваша ее захватит, а моя нет. Я понял, что там может быть любая цифра кроме 6.
 
Автор
R

RUVATA

лучше один раз увидеть, чем десять раз услышать...
Сообщения
132
Репутация
38
madmasles [?]
Любые символы кроме тех, которые в кв.скобках, не менее одного.
а какими метасимволами здесь описывается "любые символы" ? я почему то был свято уверен что это либо ".*" либо ".+"
то есть - . "любой символ" * "множество или не одного"
Или я опять мат.часть не правильно понял ?
остается разве что "?", но опть же если верить ману, то это регулятор жадности алгоритма ежели в конце группы.
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Учить матчасть! :smile:
Группа [^g</], а именно [^] означает любые символы, за исключением тех, которые перечислены после ^ в квадратных скобках
Т.е. тоже самое что ваше [0-57-9], но с точность до наоборот.
 
Верх