Что нового

[RegExp] Поиск строк по шаблону с сохранением в массив полной строки

n-deer

Новичок
Сообщения
16
Репутация
0
Добрый вечер.

Наверно, вопрос покажется несерьезным, но я так и не смог решить самостоятельно.

Необходима функция, которая ищет строки по шаблону и выдает найденные строки полностью.

В принципе, вариант решения есть (функция _SearchString1), но интуитивно чувствую, что это неэффективно, т.к. текст для поиска может содержать достаточно много строк, а искомых среди них относительно мало, поэтому сохранять все строки в массив не лучший вариант. Попробовал написать функцию, которая сохраняет в массив только нужные строки (_SearchString2), но она работает некорректно - сохраняет только найденную подстроку, а не всю строку. Либо некорректно само выражение, либо я неверно понимаю смысл флага = 3 (насколько я понял из справки, он как раз должен сохранять в массив весь фрагмент, соответствующий шаблону). Подскажите, пожалуйста, в чем ошибка (если можно, с работающим примером).

Искаться должны строки, начинающиеся на SubString1 или SubString2, при этом перед ними может быть некоторое количество пробелов.

Код:
$sText = _
"SubString1 bla bla bla" & @CRLF & _
"  SubString2 bla bla bla" & @CRLF & _
"bla bla bla SubString2 bla bla bla" & @CRLF & _
"bla bla bla"

_SearchString1()
_SearchString2()

Func _SearchString1()
	ConsoleWrite("===== _SearchString1() =====" & @CRLF)
	$asLines = StringSplit($sText, @CRLF, 1)
	For $i = 1 To $asLines[0]
		If StringRegExp($asLines[$i], "(?m)^\s*(SubString1|SubString2)", 0) Then
			ConsoleWrite($asLines[$i] & @CRLF)
		EndIf
	Next
EndFunc

Func _SearchString2()
	ConsoleWrite("===== _SearchString2() =====" & @CRLF)
	$asLines = StringRegExp($sText, "(?m)^\s*(SubString1|SubString2).*$", 3)
	For $sString In $asLines
		ConsoleWrite($sString & @CRLF)
	Next
EndFunc
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
n-deer [?]
но она работает некорректно - сохраняет только найденную подстроку, а не всю строку.

Измени шаблон:

Код:
 $asLines = StringRegExp($sText, "(?m)^\s*(SubString1|SubString2).*$", 3)
на
Код:
$asLines = StringRegExp($sText, "(?m)^\s*(SubString1|SubString2.*)$", 3)

и будет сохраняться вся строка



Добавлено:
Сообщение автоматически объединено:

n-deer [?]
сохранять все строки в массив не лучший вариант.

Если текст читается из файла, то можно читать его построчно
Код:
FileReadLine ( "filehandle/filename" [, line] )

и проверять строку так :
Код:
$sString="SubString1 bla bla bla"
;$sString="  SubString2 bla bla bla"
;$sString="bla bla bla SubString2 bla bla bla"
;$sString="bla bla bla"

$sPattern = '^\s*(SubString[1|2].*)\s*$'
$sRezult = StringRegExpReplace ( $sString ,$sPattern,'\1')
If @extended <> 0 Then MsgBox(0,'$sRezult',$sRezult)
 

gregaz

AutoIT Гуру
Сообщения
1,166
Репутация
299
Можно выполнить поиск сразу из всего текста , так :
Код:
#include<Array.au3>
$sText = _
"SubString1 bla bla bla" & @CRLF & _
"  SubString2 bla bla bla" & @CRLF & _
"bla bla bla SubString2 bla bla bla" & @CRLF & _
"bla bla bla"

$aRez=StringRegExp ( $sText ,'(?<=\r\n|^)\s*(SubString[1|2].*)\r\n',3 )
_ArrayDisplay($aRez,"$aRez")
 
Автор
N

n-deer

Новичок
Сообщения
16
Репутация
0
gregaz [?]
Измени шаблон:
/.../
и будет сохраняться вся строка
Такой шаблон находит только одну строку из 2-х правильных.

[?]
Можно выполнить поиск сразу из всего текста , так :
А этот обрезает начальные пробелы. Да и SubString1 и SubString2 приведены только для примера, реально подстроки будут отличаться не только цифрой на конце.

Но ты подтолкнул меня в нужном направлении :smile:
Получилось вот что:

Код:
$asLines = StringRegExp($sText, "(?m)^(\s*SubString1.*|\s*SubString2.*)$", 3)


Вроде делает то что требуется. Действительно все достаточно просто.
В общем, спасибо :smile:
 
Верх