PDA

Показать полную графическую версию : StringRegExp - как получить содержимое между 2-мя строками


evg64
05-12-2009, 00:29
Добрый день! Есть вопрос по тому, как вычленить содержимое между 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
Разобрался сам :) Надо было делать так:
#Include <Array.au3>
$aRegExpValue = StringRegExp(clipget(), "<SPAN class='columnValue'>((?s).*?)</SPAN>", 3)
_ArrayDisplay($aRegExpValue)

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

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

#Include <Array.au3>
$aRegExpValue = StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)(ClipGet (http://www.autoitscript.com/autoit3/docs/functions/ClipGet.htm)(), "(?s)<SPAN class='columnValue'>(?:\s?)+(.*?)(?:\s?)+</SPAN>", 3)
_ArrayDisplay($aRegExpValue)
Этот вариант будет удалять ведущие и завершающие символы пробелов (любые), если это не требуется, то из шаблона нужно убрать оба совпадения (?:\s?)+.




© OSzone.net 2001-2012