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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   StringRegExp - как получить содержимое между 2-мя строками (http://forum.oszone.net/showthread.php?t=159226)

evg64 05-12-2009 00:29 1287121

StringRegExp - как получить содержимое между 2-мя строками
 
Добрый день! Есть вопрос по тому, как вычленить содержимое между 2-мя строками. Все может выглядеть либо так:
Код:

<SPAN class='columnValue'>искомое значение</SPAN> (случай 1)
Либо так:
Код:

<SPAN class='columnValue'>
все
это
является
искомым
значением
</SPAN> (случай 2)

Либо так:
Код:

<SPAN class='columnValue'>искомое значение
</SPAN> (случай 3)

Пытаюсь получить искомые значения функцией StringRegExp (исходная строка для поиска регулярных выражений содержится в буфере обмена):
Код:

#Include <Array.au3>
$aRegExpValue = StringRegExp(clipget(), "<SPAN class='columnValue'>(.*?)\r?\n?</SPAN>", 3)
_ArrayDisplay($aRegExpValue)

Проблема в том, что функция находит лишь регулярные выражения из случая 1 (то есть <SPAN class='columnValue'>искомое значение</SPAN>).
Если </SPAN> перенесен хотя бы на одну строку вниз по сравнению с 1-й частью рег выражения, то совпадений не обнаруживается. Даже несмотря на то, что написано "\r?\n?". Как сделать так, чтобы функция возвращала совпадения из всех 3-х случаев?
P.S. Вопрос имеет лишь косвенное отношение к AutoIt, за это сори, однако спросить на этом форуме мне удобнее и быстрее всего :)

evg64 05-12-2009 01:19 1287138

Разобрался сам :) Надо было делать так:
Код:

#Include <Array.au3>
$aRegExpValue = StringRegExp(clipget(), "<SPAN class='columnValue'>((?s).*?)</SPAN>", 3)
_ArrayDisplay($aRegExpValue)


Creat0R 05-12-2009 01:19 1287139

Слишком общее название темы - такие вопросы появляются часто, поэтому тему можно было бы назвать например так: «StringRegExp - как получить содержимое между 2-мя строками»

Цитата:

Цитата evg64
Если </SPAN> перенесен хотя бы на одну строку вниз по сравнению с 1-й частью рег выражения, то совпадений не обнаруживается. »

Это потому что для служебного символа «.» который ищет любой другой символ, нужно задать режим совпадения любого символа включая новую строку...

Код:

#Include <Array.au3>
$aRegExpValue = StringRegExp(ClipGet(), "(?s)<SPAN class='columnValue'>(?:\s?)+(.*?)(?:\s?)+</SPAN>", 3)
_ArrayDisplay($aRegExpValue)

Этот вариант будет удалять ведущие и завершающие символы пробелов (любые), если это не требуется, то из шаблона нужно убрать оба совпадения (?:\s?)+.


Время: 23:38.

Время: 23:38.
© OSzone.net 2001-