Войти

Показать полную графическую версию : StringRegExpReplace — для чайников!


semiono
17-11-2010, 21:51
Не мог бы ктонибудь простые понятные примеры показать.
$s = StringRegExpReplace("ab12", "[:alpha:]","f")
MsgBox(0,"",$s)
У меня либо никакого результата, либо результат не предсказуемый. Совсем не понятно ничего. :(
Почему это альфа вдруг буквы не показывает? А паттерн {x} сам себя размножает.

И как создать тест с переносом строк внутри кода, array() чтоли?
Для удобства хочется всё в одном скрипте собрать,хотя можно и внешний тест шаблон подключить в крайнем случае.

То что в хелпе написанно, ну не понятно совершенно к сожалению. Особенно примеры утомляют напичканные
While, If, Then, тут итак мозги свернёшь, нужны примитивные примеры, а не сложные.

Redisych
17-11-2010, 22:00
Вы скажите, чего хотите добиться своим кодом. Пока вижу, что паттерн не подходит совершенно.
А строки с переносом спецсимволом \n кодируются, либо да, в массив.

Creat0R
17-11-2010, 22:18
Почему это альфа вдруг буквы не показывает? А паттерн {x} сам себя размножает. »
Я этими классами вообще не пользуюсь, предпочитаю их аналоги (в виде [a-z] и т.п.).

как создать тест с переносом строк внутри кода »
При замене? нужно добавлять @CRLF.

semiono
17-11-2010, 22:19
Тут написано
(?s) . matches anything including newline. (by default "." don't match newline)
хотел посмотреть как это работает.

либо да, в массив. »
Покажите пример?

Вы скажите, чего хотите добиться своим кодом »
Я хочу "пройти" все интересные с практической стороны паттерны, чтобы уметь пользоваться ими.

Вообще меня интересует поиск и замена строк, но хотя StringRegExpReplace это только и делает.

Redisych, загляните в этот пост, я хоть тему закрыл, но не решённым осталось
http://forum.oszone.net/post-1545134-29.html
там суть в том что надо найти одну строку, а изменить другую. Либо весь текст выстроить в строку
и править в StringRegExpReplace
Конкретно целевую строчку нельзя задавать в поиске, потомучто в файле таких строк
много, а уникальное имя получается что в строке выше.

Что-то мы отвлеклись... Давайте лучше примеры, хоть чтонибудь попроще? Или ссылку на примеры...
Ато я так никогда не научусь паттерновому мышлению.

$s = StringRegExpReplace("ab12", "[a-z]","1")
А так действительно работает! Зачем же тогда нужно [:alpha:], ну уже хоть что-то получилось! =)

Redisych
17-11-2010, 22:45
У себя нашёл обратную функцию
;Содержимое массива Длинная Строка в одну строку
For $stroka = 1 To $strokVBloke

MsgBox(0, $stroka &" cтрока такая:", $ArrayDlinStroka[$stroka] )

$Message = ($Message & $ArrayDlinStroka[$stroka])
Next

Сейчас поищу, как строки в массив засунуть.

semiono
17-11-2010, 22:46
А как можно файл построково читать, чтобы сравнивать строки с шаблоном?
Понятное дело надо найти @CRLF, только как ?

Я думаю можно организовать как цикл через
If <проверка строки с образцом> then <идти дальше или заменить>
что-то типо того.

Redisych
17-11-2010, 22:49
If $strokVBloke > 1 Then; если строк больше одной
;Заносим в массив последнюю строку, с 1-го символа и до ограничения
$ArrayDlinStroka[$strokVBloke] = StringMid ($CurrentLine, 1, $ZnakKonecPost )
EndIf

;ПРИБАВЛЯЕМ ПО ОДНОЙ СТРОКЕ, ЗАПИСЫВАЯ В МАССИВ, ПОКА НЕ НАЙДЁМ КОНЕЦ
While $NumCurrentLineFileInput <= $chisloStrokCurrentFile
;Смотрим, кончается ли строка конечным вхождением
; ИЩЕМ КОНЕЦ СООБЩЕНИЯ!
; Устанавливаем искомую строку
$entry = 'что-то там'
; регистр не важен, т.к 'что-то там' бывает маленькими
;Читаем строку № $NumCurrentLine из файла $fileIn
$CurrentLine = FileReadLine ( $fileInput, $NumCurrentLineFileInput )
;Ищем вхождение $entry с учётом регистра или без
$entryFound = StringInStr ($CurrentLine, $entry , 0 , 1 )


If $entryFound > 0 Then
If $strokVBloke = 1 Then; если вхождение найдено в 1-й строке
;Считаем конец
$StrokaKonecPost = $NumCurrentLineFileInput
$ZnakKonecPost = $entryFound - 20
;Заносим в массив единственную строку
$ArrayDlinStroka[$strokVBloke] = StringMid ($CurrentLine, $ZnakNachaloPost, $ZnakKonecPost)
EndIf
ExitLoop ;выход из цикла, если вхождение найдено
EndIf
;MsgBox (0, "Вхождение?", $entryFound)
If $strokVBloke = 1 Then; если вхождение найдено в 1-й строке
;Заносим в массив первую строку (ограничение сначала)
$ArrayDlinStroka[$strokVBloke] = StringMid ($CurrentLine, $ZnakNachaloPost)
Else
;Заносим в массив строку без ограничения по длине
$ArrayDlinStroka[$strokVBloke] = StringMid ($CurrentLine, 1 )
EndIf

;MsgBox (0, "Строка в массиве", $ArrayDlinStroka[$strokVBloke])

;увеличиваем счётчики
$strokVBloke = $strokVBloke + 1
$NumCurrentLineFileInput = $NumCurrentLineFileInput + 1

WEnd

Creat0R
17-11-2010, 23:01
хотел посмотреть как это работает. »
$sData = 'Some text' & @CRLF (http://www.autoitscript.com/autoit3/docs/macros.htm#@crlf) & 'The End'
$sRet = StringRegExpReplace (http://www.autoitscript.com/autoit3/docs/functions/StringRegExpReplace.htm)($sData, '(?s)\w+ (.*) End', '\1')
ConsoleWrite (http://www.autoitscript.com/autoit3/docs/functions/ConsoleWrite.htm)($sRet & @LF (http://www.autoitscript.com/autoit3/docs/macros.htm#@lf))

Если убрать (?s), то поиск провалится, т.к под .* попадёт любой символ кроме перевода строки, а перед ним нет вхождения End.

semiono
17-11-2010, 23:30
а что значит заменить на '\1'


---
"Match any "word" character: a-z, A-Z, 0-9 or underscore (_)."
Проверка букв из слов :lamer:
Что-то у них слишком много паттернов того что очевидно, но только наоборот сбивающих с толку.

Повторов тоже что-то много.
"Repeat the previous character, set or group 0 or more times."
а это буквально значит ноль или более раз =)
Причём ещё и эквивалентно другому паттерну ;-
ато нам одного этого не хватит )))

Интересно было бы русскую справку почитать, пойду поищу.

Моя идея с поиском конца строки, тоже не клеится, так как мне никто не будет возвращать
ни строку перед @CRLF ни её длину. Функции какие-то ограниченные. Подходящего ничего не вижу.

Впрочем, FileReadLine меня заинтересовала, надо потестировать это...
Ух! Она читает по строкам! Спасибо, Redisych за подсказку!

semiono
18-11-2010, 00:19
А как можно StringRegExp() часть строки протестировать? Сравнить с шаблоном.
[пробелы в начале] [нужная часть строки] [не нужная часть строки]
Пробелы вначале можно убрать так (?m) или точкой . Далее не знаю...
Строка содержит < скобки > слеш / "двойные кавычки" равно = и буквы... ASCII вобщем, поправте если ошибаюсь?

Creat0R
18-11-2010, 01:09
что значит заменить на '\1' »
Это значит что будет найдена группа (то что попадает в полукруглые скобки), т.е (This.*test) при замене на \1 вернёт например This is a test.

как можно StringRegExp() часть строки протестировать? Сравнить с шаблоном. »
StringRegExp (http://www.autoitscript.com/autoit3/docs/functions/StringRegExp.htm)($Test, '\s*Some Data.*')

semiono
18-11-2010, 01:28
If StringRegExp($line, "\s*<obj class=""UPoint"" name=""Size""*") = 1 Then Exit
Как зделать чтоб не Exit был, а наоборот при совпадении был переход к следующей команде.
К следующему StringRegExp( только с другим патерном)

gregaz
18-11-2010, 10:05
If StringRegExp($line, "\s*<obj class=""UPoint"" name=""Size""*") =0 Then Exit ;
;Следующая команда
;....................................

semiono
18-11-2010, 14:54
Я об этом подумал, но тогда чекнув первую строку и не найдя в ней соответствия будет выход.
Тут скорее что-то с @error нужно, только там возврат функции я не очень понял, и многообразие флагов.
--->8--
Снова моя идея провалилась! Я мыслил так, что надо проверять (StringRegExp) соответствие строк пошагово.
И найдя нужную строку следующим шагом найти другую строку, и если надо и третью.
И тут вдруг понял, что мне это ничего не даст, так как перебор итак идёт от начала и последовательно.
Причём нахождение первого экземпляра само по себе тоже ничего не значит.
Вот если бы курсор установить в эту позицию и продолжить. Но опять же всё итак по порядку читается.
А главное, что мне опять же понадобиться StringRegExpReplace после StringRegExp.
Но затея вся была лишь из-за того, чтобы "грамотно" логично настроить поиск.

Но всёравно суть лишь в том, что надо найти ключевые слова из нескольких строк, выстроить их в паттерн
и применить StringRegExpReplace к блоку. Поэтому всё уже итак зделано. Надо лишь условие уточнить.
Видимо из-за неверно установленных уникальных слов замена не корректно происходит.
Обычно при наличии похожих блоков почему-то редактируется всегда самый нижний во всём XML.
И ещё плохо что он один редактируется, было бы уж лучше тогда чтобы все зацепило функцией
подходящие под образец, раз уж они похожи.

AZJIO
21-11-2010, 01:51
Обычно при наличии похожих блоков почему-то редактируется всегда самый нижний во всём XML.
И ещё плохо что он один редактируется, было бы уж лучше тогда чтобы все зацепило функцией
подходящие под образец, раз уж они похожи. »
Значит регулярное выражение составлено неверно. Там есть жадный и не жадный квантификатор. Жадный ищет до последнего совпадения, не жадный до первого попавшегося и заменяет все последующие. Вот ещё утилиткой (http://azjio.ucoz.ru/load/vsjo_dlja_autoit3/skompilirovannye_skripty/regexp/4-1-0-27) воспользуйся.




© OSzone.net 2001-2012