PDA

Показать полную графическую версию : [решено] Регулярные выражения в AutoIt


Страниц : [1] 2

morgan1991
15-04-2010, 15:37
Заранее прошу прощения если темы уже была, поиском не нашол ничего подходящего.
Вообщем проблема в следующем, читал русскую справку (про английскую вообще молчу) и никак не могу понять написание шаблонов для
StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)
StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)
В справке не достаточно понятно как использовать такие шаблоны. + к этому у меня всегда были проблемы с рег. выражениями в других языках...

Хотелось бы чтоб ктонибудь объяснить популярно как составлять такие шаблоны.
В справке есть таблица специальных символов (Элементы шаблона), но по ней для меня очень сложно составить шаблон.
Пример такой:
Нужно из текста выковырять все ссылки такого вида:
view.php?ad=122887
view.php?ad=12285
view.php?ad=1222287
Меняется только число после =
Дак вот вродибы простое выражение, а у меня составило много трудностей.
Исходя из справки у меня получился такой шаблон:
StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($Text, "(view.php?ad=)\d*", 1)
Но он в корне не правильный, а у меня даже мысли нет почему?
Поэтому прошу помощи в освоении регулярных выражениях...

amel27
15-04-2010, 16:34
он в корне не правильный »
только немного подправить:
StringRegExp($sText, "view.php\?ad=\d+", 3)

morgan1991
15-04-2010, 16:58
amel27, у меня не работает...
Сделал так и заработало:
StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($Text, "(view.php\?ad\=\d+)", 3)

amel27
15-04-2010, 17:07
morgan1991, странно, "=" вроде не является метасимволом в такой комбинации :dont-know

kim-aa
15-04-2010, 17:11
Точка является метасимволом

В perl это было бы так
view\.php\?ad=\d+

Скобки, кстати, в стандартной Regex машине является способом адресации к вхождению, а не только ограничителем

amel27
15-04-2010, 17:18
kim-aa, точно, не заметил... хотя на работу выражения это не повлияло :)
а чтобы не следить за всеми метасимволами можно экранировать всю подстроку:
\Qview.php?ad=\E\d+

kim-aa
15-04-2010, 17:28
Нужно из текста выковырять все ссылки такого вида:
view.php?ad=122887
view.php?ad=12285
view.php?ad=1222287 »

Пример текста приведите.

Может быть имеет смысл ввести в строке поиска выравнивание по границе слова:

типа этого

\bview\.php\?ad=\d+\b

morgan1991
15-04-2010, 17:36
Пример текста приведите. »

<tr>
<td width="70%" class="al3"><span class="al6">
<a class=al4 href=view.php?ad=122562 target=_blank>Don't Wait Another Minute. Make Money Today!</a>
</span></td>
<td width="10%" class="al5"><span class="al6">
402642</span></td>
<td width="10%" class="al5"><span class="al6">
4300</span></td>

<td width="10%" class="al5"><span class="al6">
406942</span></td>
</tr>

<tr>
<td width="70%" class="al3"><span class="al6">
<a class=al4 href=view.php?ad=122564 target=_blank>$12,200.29 In Only 5 Days</a>
</span></td>
<td width="10%" class="al5"><span class="al6">
402647</span></td>

<td width="10%" class="al5"><span class="al6">
4558</span></td>
<td width="10%" class="al5"><span class="al6">
407205</span></td>
</tr>

<tr>
<td width="70%" class="al3"><span class="al6">
<a class=al4 href=view.php?ad=122565 target=_blank>$3,456 Google Pay Day</a>
</span></td>

<td width="10%" class="al5"><span class="al6">
402649</span></td>
<td width="10%" class="al5"><span class="al6">
4537</span></td>
<td width="10%" class="al5"><span class="al6">
407186</span></td>
</tr>
Может быть имеет смысл ввести в строке поиска выравнивание по границе слова »
Да и так всё вродибы отлично работает...

morgan1991
25-05-2010, 19:42
Помогите пожалуйста ещё с таким выражением:

[цифры меняющиеся1,цифры меняющиеся2,["Меняющийся текст1"],[цифры меняющиеся3,"Меняющийся текст2","ссылка на файл","

Необходимо получить двумерный массив:
$arr[0][0] = цифры меняющиеся1
$arr[0][1] = цифры меняющиеся2
$arr[0][2] = Меняющийся текст1
$arr[0][3] = цифры меняющиеся3
$arr[0][4] = Меняющийся текст2
$arr[0][5] = ссылка на файл
$arr[1][0] = цифры меняющиеся1
$arr[1][1] = цифры меняющиеся2
$arr[1][2] = Меняющийся текст1
$arr[1][3] = цифры меняющиеся3
$arr[1][4] = Меняющийся текст2
$arr[1][5] = ссылка на файл
И так далее...

У меня получилось так:
StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($text, '\[\(d*)\,\(d*)\,\[\"(.*)\"\]\,\[(\d*)\,\"(.*)\"\,\"(.*)\"\,\"', 3)
Но не работает... :(

amel27
26-05-2010, 03:25
morgan1991, дайте рабочий пример в несколько строчек

morgan1991
26-05-2010, 08:24
{"n":4,"d":[[73355227,1274794749,["Необходимо получить двумерный массив:"],[53261465,"jhgf jjj","http://cs386.userapi.com/u53261465/y_hjjg.jpg","c_0ef1b41x:001",1,0],[1411059575]],[73354434,1274792979,["morgan1991, дайте рабочий пример в несколько строчек"],[53261465,"test morgan","http://cs386.userapi.com/u53261465/84_jtfd921c.jpg","c_0ef1b41x:001",1,0],[1411059575]],[73354284,1274792596,["Спасибочки)))))"],[40839431,"Viktoria Test","http://cs580.userapi.com/u40839431/k_gif5913.jpg","c_89cf5a1x:002",1,0],[1411059575]],[73340415,1274730302,["привет,как у тебя дела????"],[53261465,"Alenka Press","http://cs386.userapi.com/u53261465/u_f45f921c.jpg","c_0ef1b41x:001",1,0],[1411059575]],"h":883000002}

amel27
26-05-2010, 09:48
morgan1991, хде-то так:
#include <array.au3>

$sText = '{"n":4,"d":[[73355227,1274794749,["Необходимо получить двумерный массив:"],[53261465,"jhgf jjj","http://cs386.userapi.com/u53261465/y_hjjg.jpg","c_0ef1b41x:001",1,0],[1411059575]],[73354434,1274792979,["morgan1991, дайте рабочий пример в несколько строчек"],[53261465,"test morgan","http://cs386.userapi.com/u53261465/84_jtfd921c.jpg","c_0ef1b41x:001",1,0],[1411059575]],[73354284,1274792596,["Спасибочки)))))"],[40839431,"Viktoria Test","http://cs580.userapi.com/u40839431/k_gif5913.jpg","c_89cf5a1x:002",1,0],[1411059575]],[73340415,1274730302,["привет,как у тебя дела????"],[53261465,"Alenka Press","http://cs386.userapi.com/u53261465/u_f45f921c.jpg","c_0ef1b41x:001",1,0],[1411059575]],"h":883000002}'
$aText = StringRegExp($sText, '\[(\d++),(\d++),\["([^]"]*+)"\],\[(\d++),"([^"]*+)","([^"]*+)",', 3)
$uText = UBound($aText)

Dim $aOut [$uText/6][6]
For $i=0 To $uText-1 Step 6
For $j=0 To 5
$aOut[$i/6][$j]=$aText[$i+$j]
Next
Next

_ArrayDisplay($aOut)

morgan1991
26-05-2010, 13:06
amel27, работает отлично, но выводит не всё... Я думаю скорее всего из-за того, что в
Меняющийся текст1 »
иногда встречаются разные символы, например:
{[}]+=&*(^%)_|\/ и т.д.
Возможно выражение их игнорирует... А в частности заметил, если в тексте есть текст[текст]текст, то он игнорирует эту часть...

amel27
26-05-2010, 13:26
иногда встречаются разные символы »
как обычно - давайте нерабочие примеры, менее жесткий вариант:
'\[(\d++),(\d++),\["([^"]*+)"\],\[(\d++),"([^"]*+)","([^"]*+)",'

morgan1991
26-05-2010, 13:41
{"n":4,"d":[[73355227,1274794749,["Необходимо [app]получить двумерный массив:"],[53261465,"jhgf jjj","http://cs386.userapi.com/u53261465/y_hjjg.jpg","c_0ef1b41x:001",1,0],[1411059575]],[73354434,1274792979,["morgan1991, дайте рабочий пример в не[app]сколько строчек"],[53261465,"test morgan","http://cs386.userapi.com/u53261465/84_jtfd921c.jpg","c_0ef1b41x:001",1,0],[1411059575]],[73354284,1274792596,["Спасибочки)))))"],[40839431,"Viktoria Test","http://cs580.userapi.com/u40839431/k_gif5913.jpg","c_89cf5a1x:002",1,0],[1411059575]],[73340415,1274730302,["привет,как у[app] тебя дела????"],[53261465,"Alenka Press","http://cs386.userapi.com/u53261465/u_f45f921c.jpg","c_0ef1b41x:001",1,0],[1411059575]],"h":883000002}

amel27
27-05-2010, 10:42
morgan1991, у меня последнее выражение нормально отрабатывает... конечно, можно для надежности добить весь блок до закрывающей скобки, но думаю это лишнее:
'\[(\d++),(\d++),\["([^"]*+)"\],\[(\d++),"([^"]*+)","([^"]*+)","[^"]*+",\d++,\d++\],\[\d+\]\]'

morgan1991
27-05-2010, 15:57
amel27, спасибо огромное, работает.
А вот ещё иногда бывают такие случаи:
[73388045,1274894102,["<a href='http://cs945.userapi.com/u11909801/l_c9f2e05b.png'><img src='http://cs945.userapi.com/u11909801/m_ce4c5ebc.png'/></a>",2,"","http://cs945.userapi.com/u11909801/m_ce4c5ebc.png","http://cs945.userapi.com/u11909801/l_c9f2e05b.png",11909801,222769342],[11909801,"Yevgeny Vladimirovich","http://cs228.userapi.com/u11909801/b_06451668.jpg","c_2234ac1x:001",2,0],[1411059575]],[73377400,1274871984,["[[app_post1830401|a_11909801_4718705_162769015|b0c02new1090000]]"],[11909801,"Yevgeny Vladimirovich","http://cs228.userapi.com/u11909801/b_06451668.jpg","c_2234ac1x:001",2,0],[1411059575]]
Возможно и его одновременно обрабатывать? Тут нужно чтоб приходил, не только текст, должна вернутся строчка:
"<a href='http://cs945.userapi.com/u11909801/l_c9f2e05b.png'><img src='http://cs945.userapi.com/u11909801/m_ce4c5ebc.png'/></a>",2,"","http://cs945.userapi.com/u11909801/m_ce4c5ebc.png","http://cs945.userapi.com/u11909801/l_c9f2e05b.png",11909801,222769342

amel27
28-05-2010, 17:05
вот ещё иногда бывают такие случаи »
тут два блока разного формата, вот разбор:

$sText = '['& _
'73388045,'& _
'1274894102,'& _
'['& _
'"<a href=''http://cs945.userapi.com/u11909801/l_c9f2e05b.png''><img src=''http://cs945.userapi.com/u11909801/m_ce4c5ebc.png''/></a>",'& _
'2,'& _
'"",'& _
'"http://cs945.userapi.com/u11909801/m_ce4c5ebc.png",'& _
'"http://cs945.userapi.com/u11909801/l_c9f2e05b.png",'& _
'11909801,'& _
'222769342'& _
'],'& _
'['& _
'11909801,'& _
'"Yevgeny Vladimirovich",'& _
'"http://cs228.userapi.com/u11909801/b_06451668.jpg",'& _
'"c_2234ac1x:001",'& _
'2,'& _
'0'& _
'],'& _
'['& _
'1411059575'& _
']'& _
'],'& _
'['& _
'73377400,'& _
'1274871984,'& _
'['& _
'"[[app_post1830401|a_11909801_4718705_162769015|b0c02new1090000]]"'& _
'],'& _
'['& _
'11909801,'& _
'"Yevgeny Vladimirovich",'& _
'"http://cs228.userapi.com/u11909801/b_06451668.jpg",'& _
'"c_2234ac1x:001",'& _
'2,'& _
'0'& _
'],'& _
'['& _
'1411059575'& _
']'& _
']'


нужно чтоб приходил, не только текст, должна вернутся строчка »в смысле?.. каким элементом массива?.. переформулируйте исходную задачу

morgan1991
28-05-2010, 17:14
в смысле?.. каким элементом массива?.. переформулируйте исходную задачу »
Я имел ввиду что не нужно разбивать на части эту часть:
"<a href='http://cs945.userapi.com/u11909801/l_c9f2e05b.png'><img src='http://cs945.userapi.com/u11909801/m_ce4c5ebc.png'/></a>",2,"","http://cs945.userapi.com/u11909801/m_ce4c5ebc.png","http://cs945.userapi.com/u11909801/l_c9f2e05b.png",11909801,222769342
Т.е.
["Меняющийся текст1"] »
Нужно оставить как есть и запихать в элемент массива.

amel27
28-05-2010, 17:38
Нужно оставить как есть и запихать в элемент массива. »а как быть с кавычками?.. ведь тогда из второго блока получится:
["[[app_post1830401|a_11909801_4718705_162769015|b0c02new1090000]]"]
или нужно проверять количество элементов в блоке и в зависимости от этого выщелкивать текст/блок?




© OSzone.net 2001-2012