Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Регулярные выражения в AutoIt (http://forum.oszone.net/showthread.php?t=173223)

morgan1991 15-04-2010 15:37 1393347

Регулярные выражения в AutoIt
 
Заранее прошу прощения если темы уже была, поиском не нашол ничего подходящего.
Вообщем проблема в следующем, читал русскую справку (про английскую вообще молчу) и никак не могу понять написание шаблонов для
В справке не достаточно понятно как использовать такие шаблоны. + к этому у меня всегда были проблемы с рег. выражениями в других языках...

Хотелось бы чтоб ктонибудь объяснить популярно как составлять такие шаблоны.
В справке есть таблица специальных символов (Элементы шаблона), но по ней для меня очень сложно составить шаблон.
Пример такой:
Нужно из текста выковырять все ссылки такого вида:
view.php?ad=122887
view.php?ad=12285
view.php?ad=1222287
Меняется только число после =
Дак вот вродибы простое выражение, а у меня составило много трудностей.
Исходя из справки у меня получился такой шаблон:
Код:

StringRegExp($Text, "(view.php?ad=)\d*", 1)
Но он в корне не правильный, а у меня даже мысли нет почему?
Поэтому прошу помощи в освоении регулярных выражениях...

amel27 15-04-2010 16:34 1393408

Цитата:

Цитата morgan1991
он в корне не правильный »

только немного подправить:
Код:

StringRegExp($sText, "view.php\?ad=\d+", 3)

morgan1991 15-04-2010 16:58 1393435

amel27, у меня не работает...
Сделал так и заработало:
Код:

StringRegExp($Text, "(view.php\?ad\=\d+)", 3)

amel27 15-04-2010 17:07 1393440

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

kim-aa 15-04-2010 17:11 1393445

Точка является метасимволом

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

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

amel27 15-04-2010 17:18 1393450

kim-aa, точно, не заметил... хотя на работу выражения это не повлияло :)
а чтобы не следить за всеми метасимволами можно экранировать всю подстроку:
Код:

\Qview.php?ad=\E\d+

kim-aa 15-04-2010 17:28 1393460

Цитата:

Цитата morgan1991
Нужно из текста выковырять все ссылки такого вида:
view.php?ad=122887
view.php?ad=12285
view.php?ad=1222287 »

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

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

типа этого

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

morgan1991 15-04-2010 17:36 1393464

Цитата:

Цитата kim-aa
Пример текста приведите. »

Код:

<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>

Цитата:

Цитата kim-aa
Может быть имеет смысл ввести в строке поиска выравнивание по границе слова »

Да и так всё вродибы отлично работает...

morgan1991 25-05-2010 19:42 1420959

Помогите пожалуйста ещё с таким выражением:
Код:

[цифры меняющиеся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($text, '\[\(d*)\,\(d*)\,\[\"(.*)\"\]\,\[(\d*)\,\"(.*)\"\,\"(.*)\"\,\"', 3)
Но не работает... :(

amel27 26-05-2010 03:25 1421234

morgan1991, дайте рабочий пример в несколько строчек

morgan1991 26-05-2010 08:24 1421295

Код:

{"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 1421324

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 1421448

amel27, работает отлично, но выводит не всё... Я думаю скорее всего из-за того, что в
Цитата:

Цитата morgan1991
Меняющийся текст1 »

иногда встречаются разные символы, например:
{[}]+=&*(^%)_|\/ и т.д.
Возможно выражение их игнорирует... А в частности заметил, если в тексте есть текст[текст]текст, то он игнорирует эту часть...

amel27 26-05-2010 13:26 1421462

Цитата:

Цитата morgan1991
иногда встречаются разные символы »

как обычно - давайте нерабочие примеры, менее жесткий вариант:
Код:

'\[(\d++),(\d++),\["([^"]*+)"\],\[(\d++),"([^"]*+)","([^"]*+)",'

morgan1991 26-05-2010 13:41 1421471

Код:

{"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 1422073

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

'\[(\d++),(\d++),\["([^"]*+)"\],\[(\d++),"([^"]*+)","([^"]*+)","[^"]*+",\d++,\d++\],\[\d+\]\]'

morgan1991 27-05-2010 15:57 1422258

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 1423074

Цитата:

Цитата morgan1991
вот ещё иногда бывают такие случаи »

тут два блока разного формата, вот разбор:
Код:

$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
нужно чтоб приходил, не только текст, должна вернутся строчка »

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

morgan1991 28-05-2010 17:14 1423078

Цитата:

Цитата amel27
в смысле?.. каким элементом массива?.. переформулируйте исходную задачу »

Я имел ввиду что не нужно разбивать на части эту часть:
Код:

"<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
Т.е.
Цитата:

Цитата morgan1991
["Меняющийся текст1"] »

Нужно оставить как есть и запихать в элемент массива.

amel27 28-05-2010 17:38 1423095

Цитата:

Цитата morgan1991
Нужно оставить как есть и запихать в элемент массива. »

а как быть с кавычками?.. ведь тогда из второго блока получится:
Код:

["[[app_post1830401|a_11909801_4718705_162769015|b0c02new1090000]]"]
или нужно проверять количество элементов в блоке и в зависимости от этого выщелкивать текст/блок?

morgan1991 28-05-2010 19:07 1423125

Цитата:

Цитата amel27
а как быть с кавычками?.. ведь тогда из второго блока получится: »

тогда думаю можно выковыривать только вот эту часть:
Код:

<a href='http://cs945.userapi.com/u11909801/l_c9f2e05b.png'><img src='http://cs945.userapi.com/u11909801/m_ce4c5ebc.png'/></a>
Код:

[[app_post1830401|a_11909801_4718705_162769015|b0c02new1090000]]
А остальное можно отбросить.

amel27 29-05-2010 08:51 1423397

Цитата:

Цитата morgan1991
думаю можно выковыривать только вот эту часть »

только первый элемент?.. тогда так:
Код:

'\[(\d++),(\d++),\["([^"]*+)"(?:,"[^"]*+"|,\d+)*+\],\[(\d++),"([^"]*+)","([^"]*+)"(?:,"[^"]*+"|,\d+)*+],\[\d+(?:,"[^"]*+"|,\d+)*+\]\]'

morgan1991 30-05-2010 14:39 1423981

amel27, спасибо огромное, всё отлично функционирует.

morgan1991 20-10-2010 17:04 1523259

Очередной раз прошу помощи, т.к. ну никак не могу сделать сам.
Есть переменная $test, которая содержит html страницы.
Нужно найти в ней самый последний тег </div> и удалить всё что находится после него.

amel27 21-10-2010 03:00 1523654

Код:

StringRegExpReplace($test, '(^.*</div>).*+', '\1')

morgan1991 21-10-2010 13:44 1523959

amel27, к сожалению не работает

amel27 21-10-2010 13:57 1523969

Цитата:

Цитата morgan1991
не работает »

пост #14

morgan1991 21-10-2010 16:41 1524097

Вложений: 1
прикладываю пример кода.
Извиняюсь, неправильно сказал, нужно убрать всё после строки:
Код:

Следуйте инструкциям. </P><INPUT value=Оплатить type=submit> </FORM></DIV></DIV></DIV>
И затем в конец дописать:
Код:

</BODY></HTML>

morgan1991 21-10-2010 22:39 1524380

Решил сам:

Код:

$test = StringRegExpReplace($test, "Следуйте инструкциям. </P><INPUT value=Оплатить type=submit> </FORM></DIV></DIV></DIV>(?s)(.*)", "Следуйте инструкциям. </P><INPUT value=Оплатить type=submit> </FORM></DIV></DIV></DIV>" & @CRLF & "</BODY></HTML>")

gregaz 22-10-2010 07:34 1524515

Цитата:

Цитата morgan1991
Решил сам: »

Можно упростить выражение :

Код:

$test = StringRegExpReplace($test, "(?s)(.+Следуйте инструкциям.+</DIV></DIV></DIV>).+", "\1"& @CRLF & "</BODY></HTML>")

morgan1991 22-10-2010 15:14 1524849

Цитата:

Цитата gregaz
Можно упростить выражение »

для меня это наоборот усложнить, но сократить... :)

gregaz 22-10-2010 16:28 1524903

Цитата:

Цитата morgan1991
для меня это наоборот усложнить, но сократить.. »

Почему ? По крайней мере не стоит повторять 2 раза текстовый фрагмент , ведь достаточно заменить его на его эквивалент : "\1"

А так еще чуть проще :

Код:

$test = StringRegExpReplace($test, "(?s)(.+Следуйте инструкциям.+?</DIV></DIV></DIV>).+(</BODY></HTML>)", "\1"& @CRLF & "\2")

morgan1991 22-10-2010 17:59 1524946

Цитата:

Цитата gregaz
Почему ? »

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

"\1"& @CRLF & "\2"


Время: 18:32.

Время: 18:32.
© OSzone.net 2001-