Автор Тема: StringRegExp , Замена фрагментов строки по шаблону  (Прочитано 13696 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
Код: AutoIt [Выделить]
$f = "браз"
$t = "Шаблон"
$s = "Образец|Опера|Север|Образ|Запад|Восток|Образа"
$r = "(^|\|)([^|]*?"& $f &"[^|]*)"

ConsoleWrite( StringRegExpReplace($s, $r, "$1"& $t) &@CRLF)


Русское сообщество AutoIt

Re: StringRegExp , Замена фрагментов строки по шаблону
« Ответ #15 Отправлен: Декабрь 10, 2009, 11:00:58 »

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166

  • Автор темы
  • Репутация: 298
  • Пол: Мужской
    • Награды
Похоже получил вроде то,что надо :
Код: AutoIt [Выделить]
$sStr='Образ|Опера|Образ|Опера|Север|Образец|Запад|Восток|Образа'
ConsoleWrite(StringRegExpReplace($sStr, "[^\|]*раз[^\|]*", 'Шаблон')&  @CRLF)
; Полученный результат :   Шаблон|Опера|Шаблон|Опера|Север|Шаблон|Запад|Восток|Шаблон
 


И код простой и понятный.




Добавлено: Декабрь 10, 2009, 11:25:07
amel27 , спасибо

Помоему у меня получился еще проще код , не знаю насколько он корректен - надо погонять его .


« Последнее редактирование: Декабрь 10, 2009, 11:27:35 от gregaz, Причина: Объединение сообщений »
Самая большая проблема – её сформулировать. 

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
И код простой и понятный.

Согласен, мой отличается от твоего только наличием якорных символов в начале шаблона - их обычно ставят для ускорения обработки, но для разбора коротких строк это некритично (тем более, что в AutoIT куча времени уходит на предкомпиляцию самого выражения)

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166

  • Автор темы
  • Репутация: 298
  • Пол: Мужской
    • Награды
Окончательное решение :
Код: AutoIt [Выделить]
$f = "бра"
$t = "Шаблон"
$s = "Образец|Опера|Север|Образ|Запад|Восток|Образа"
;$r ="[^\|]*" & $f & "[^\|]*"
$r ="[^|]*" & $f & "[^|]*"
ConsoleWrite( StringRegExpReplace($s, $r, $t) &@CRLF)
 

Возникает несколько вопросов :
1. Насколько оно оптимально ?
2. Каков логический смысл присутствия символов " * " (мне малопонятна их необходимость,хотя без них -не работает) ?
« Последнее редактирование: Декабрь 10, 2009, 14:07:34 от gregaz »

Русское сообщество AutoIt

Re: StringRegExp , Замена фрагментов строки по шаблону
« Ответ #18 Отправлен: Декабрь 10, 2009, 12:22:52 »

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
1. Насколько оно оптимально ?
2. Каков логический смысл присутствия символов " * " (мне малопонятна их необходимость,хотя без них -не работает) ?

1. ИМХО вполне, можно немного оптимизировать:

Код: AutoIt [Выделить]
$r ="[^|]*" & $f & "[^|]*+"


...только нужно помнить, что $f не просто строка (литера), а регулярное выражение и это можно использовать... например, отключить учёт регистра:

Код: AutoIt [Выделить]
$f = "[Бб][Рр][Аа]"


2. * - любое количество символов заданного класса ([^|]), без него шаблон будет обозначать: обязательное наличие ОДНОГО символа заданного класса (не разделитель) ПЕРЕД и ПОСЛЕ заданного фрагмента - вот этот кусок и будет заменен.

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166

  • Автор темы
  • Репутация: 298
  • Пол: Мужской
    • Награды
2. * - любое количество символов заданного класса ([^|]), без него шаблон будет обозначать: обязательное наличие ОДНОГО символа заданного класса (не разделитель)

А почему тогда не " ? "  ?
Это было бы логичней (ведь вначале и конце строки  разделитель " | " отсутствует ).



Добавлено: Декабрь 10, 2009, 12:57:36
И почему работает без экранирования " | "  ?

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
А почему тогда не " ? "  ?
Это было бы логичней (ведь вначале и конце строки  разделитель " | " отсутствует ).

"?" обозначает один, но необязательный символ, а если в слове перед искомой фразой ("бра") два и более символов?.. все эти символы не будут включены в замену

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166

  • Автор темы
  • Репутация: 298
  • Пол: Мужской
    • Награды
И в чем небходимость символа "+" в:
Код: AutoIt [Выделить]
$r ="[^|]*" & $f & "[^|]*+"
 



Добавлено: Декабрь 10, 2009, 13:15:20
gregaz  [?]
Цитировать
И почему работает без экранирования " | "  ?
« Последнее редактирование: Декабрь 10, 2009, 14:06:07 от gregaz, Причина: Объединение сообщений »

Русское сообщество AutoIt

Re: StringRegExp , Замена фрагментов строки по шаблону
« Ответ #22 Отправлен: Декабрь 10, 2009, 13:03:20 »

Оффлайн amel27 [?]

  • VIP
  • *
  • Сообщений: 146
  • Репутация: 55
  • Пол: Мужской
    • Награды
И в чем небходимость символа "+"

обычная "*" пытается применить остаток регулярного выражения для КАЖДОГО отбираемого символа, "*+" сначала пропускает все подходящие под условие символы и только после этого продолжает дальнейшую проверку... поэтому, применять "*+" нужно аккуратно - в начале выражения оно приведет к запуску проверки "бра" только в конце каждого слова, т.е. всегда будет давать отрицательный результат

Оффлайн gregaz [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1166

  • Автор темы
  • Репутация: 298
  • Пол: Мужской
    • Награды
amel27 Еще раз спасибо за разъяснения.
Интересно , что  Regex Coach ругается на недопустимость сочетания *+ , но вживую все работает,а самое главное мне многое стало понятно .
Тему закрываю

Русское сообщество AutoIt

Re: StringRegExp , Замена фрагментов строки по шаблону
« Ответ #24 Отправлен: Декабрь 10, 2009, 17:13:01 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
12 Ответов
8525 Просмотров
Последний ответ Ноябрь 15, 2009, 17:32:25
от gregaz
3 Ответов
4833 Просмотров
Последний ответ Май 13, 2011, 01:40:09
от n-deer
4 Ответов
3413 Просмотров
Последний ответ Апрель 11, 2012, 18:10:18
от Garrett
1 Ответов
2058 Просмотров
Последний ответ Март 23, 2013, 09:14:37
от AZJIO
2 Ответов
1287 Просмотров
Последний ответ Май 11, 2014, 23:57:11
от erlik
2 Ответов
1968 Просмотров
Последний ответ Июнь 01, 2015, 11:28:10
от ---Zak---
3 Ответов
1557 Просмотров
Последний ответ Июль 14, 2015, 17:52:26
от Vovsla
5 Ответов
1649 Просмотров
Последний ответ Июль 21, 2015, 09:26:16
от op_joke
3 Ответов
3725 Просмотров
Последний ответ Сентябрь 01, 2015, 12:55:24
от op_joke
21 Ответов
3919 Просмотров
Последний ответ Апрель 08, 2016, 18:54:51
от man_without_face