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

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

semiono 17-11-2010 21:51 1545212

StringRegExpReplace — для чайников!
 
Не мог бы ктонибудь простые понятные примеры показать.
Код:

$s = StringRegExpReplace("ab12", "[:alpha:]","f")
MsgBox(0,"",$s)

У меня либо никакого результата, либо результат не предсказуемый. Совсем не понятно ничего. :(
Почему это альфа вдруг буквы не показывает? А паттерн {x} сам себя размножает.

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

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

Redisych 17-11-2010 22:00 1545220

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

Creat0R 17-11-2010 22:18 1545236

Цитата:

Цитата semiono
Почему это альфа вдруг буквы не показывает? А паттерн {x} сам себя размножает. »

Я этими классами вообще не пользуюсь, предпочитаю их аналоги (в виде [a-z] и т.п.).

Цитата:

Цитата semiono
как создать тест с переносом строк внутри кода »

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

semiono 17-11-2010 22:19 1545237

Тут написано
Цитата:

(?s) . matches anything including newline. (by default "." don't match newline)
хотел посмотреть как это работает.

Цитата:

Цитата Redisych
либо да, в массив. »

Покажите пример?

Цитата:

Цитата Redisych
Вы скажите, чего хотите добиться своим кодом »

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

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

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

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

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

Redisych 17-11-2010 22:45 1545247

У себя нашёл обратную функцию
Код:

;Содержимое массива Длинная Строка в одну строку 
For $stroka = 1 To $strokVBloke

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

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

semiono 17-11-2010 22:46 1545250

А как можно файл построково читать, чтобы сравнивать строки с шаблоном?
Понятное дело надо найти @CRLF, только как ?

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

Redisych 17-11-2010 22:49 1545251

Код:

      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 1545259

Цитата:

Цитата semiono
хотел посмотреть как это работает. »

Код:

$sData = 'Some text' & @CRLF & 'The End'
$sRet = StringRegExpReplace($sData, '(?s)\w+ (.*) End', '\1')
ConsoleWrite($sRet & @LF)

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

semiono 17-11-2010 23:30 1545282

а что значит заменить на '\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 1545318

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

Creat0R 18-11-2010 01:09 1545335

Цитата:

Цитата semiono
что значит заменить на '\1' »

Это значит что будет найдена группа (то что попадает в полукруглые скобки), т.е (This.*test) при замене на \1 вернёт например This is a test.

Цитата:

Цитата semiono
как можно StringRegExp() часть строки протестировать? Сравнить с шаблоном. »

Код:

StringRegExp($Test, '\s*Some Data.*')

semiono 18-11-2010 01:28 1545345

Код:

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

gregaz 18-11-2010 10:05 1545478

Код:

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


semiono 18-11-2010 14:54 1545683

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

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

AZJIO 21-11-2010 01:51 1547557

Цитата:

Цитата semiono
Обычно при наличии похожих блоков почему-то редактируется всегда самый нижний во всём XML.
И ещё плохо что он один редактируется, было бы уж лучше тогда чтобы все зацепило функцией
подходящие под образец, раз уж они похожи. »

Значит регулярное выражение составлено неверно. Там есть жадный и не жадный квантификатор. Жадный ищет до последнего совпадения, не жадный до первого попавшегося и заменяет все последующие. Вот ещё утилиткой воспользуйся.


Время: 11:29.

Время: 11:29.
© OSzone.net 2001-