Что нового

StringRegExp проверяет до первого совпадения и потом останавливается

alex2887

Новичок
Сообщения
57
Репутация
0
Всем привет, пытаюсь разобраться как сделать, чтобы функция Stringregexp искала нужное слово по всему тексту, выводило результат по найденным совпадениям через _ArrayDisplay, после чего исправляла слова с помощью функции StringRegExpReplace и после всех операций сохраняла результат.
Вот мой пример скрипта:
Код:
#include <Array.au3>

$file = @ScriptDir & ('\1.txt') ; задаем переменную текстовому документу

$read = FileRead($file) ;производим чтение его содержимого

$string = StringRegExp($read, '[м|М][е|и][т|д]ве[т|д][а-я]', 3) ;ищем совпадение слова с помощью шаблона

_ArrayDisplay($string) ;выводим найденные совпадения в виде таблицы

$stringrep = StringRegExpReplace($read, '[м|М][е|и][т|д]ве[т|д][а-я]', 'Медведь') ;производим поиск в тексте с помощью шаблона и делаем замену на заданное слово 'Медведь'

FileDelete($file); удаляем предыдущий текстовый документ

FileWrite($file, $stringrep) ;производим создание нового документа со старым названием, но с исправленным текстом
А это сам текст, в котором нужно произвести поиск и сделать замену на нужное слово
Мидведь подошел к большому дубу.
Медветь засунул лапу в дупло.
Медвед зачерпнул пригоршню меда.
Пчелы начали кусать медведя.
Медведь побежал к речке.
Заранее спасибо за помощь.
 

Vintets

Новичок
Сообщения
12
Репутация
4
Вроде нормально всё отрабатывает.
Только лучше наверно так
Код:
$string = StringRegExp($read, '[м|М][е|и][т|д]ве[т|д][а-я]*', 3)
$stringrep = StringRegExpReplace($read, '([м|М])[е|и][т|д]ве[т|д][а-я]*', '\1едведь')


чтоб отлавливало "медвед" и заменяло на слово начинающееся со строчной/заглавной.
 
Автор
A

alex2887

Новичок
Сообщения
57
Репутация
0
Vintets сказал(а):
Вроде нормально всё отрабатывает.
Только лучше наверно так
Код:
$string = StringRegExp($read, '[м|М][е|и][т|д]ве[т|д][а-я]*', 3)
$stringrep = StringRegExpReplace($read, '([м|М])[е|и][т|д]ве[т|д][а-я]*', '\1едведь')


чтоб отлавливало "медвед" и заменяло на слово начинающееся со строчной/заглавной.
Спасибо за помощь, объясните пожалуйста, на счет вот этого слова "'\1едведь'", почему вначале стоит слэш и 1?
 

Vintets

Новичок
Сообщения
12
Репутация
4
Ссылка на группу (то что в круглых скобках), в данном случае м или М
 
A

Alofa

Гость
alex2887, Vintets
Кто-нибудь из вас Это пытался изучить?

Код:
$sText = 'Мидвед подошел к большому дубу.' & @CRLF & _
		'Медветь засунул лапу в дупло.' & @CRLF & _
		'МюдведZqw зачерпнул пригоршню меда. ' & @CRLF & _
		'Пчелы начали кусать медветя.' & @CRLF & _
		'метведи побежали к речке.'

$sText = StringRegExpReplace($sText, '(?i)(м)([а-я]{2}ве[а-я])', '$1едвед')
; MsgBox(262144, 1, $sText)
$sText = StringRegExpReplace($sText, '(?i)(медвед)(?:[^а-я]+|\h)', '$1ь ')
MsgBox(262144, 2, $sText)
 
Автор
A

alex2887

Новичок
Сообщения
57
Репутация
0
Кто-нибудь из вас Это пытался изучить?

Я пытаюсь, получается плохо, т.к. там столько информации по этим знакам, буквам, цифрам, по составлению шаблонов, что переварить очень сложно для человека, который никогда не занимался программированием :stars:. Но Autoit меня заинтересовал, и я буду дальше его изучать. :smile:
 
A

Alofa

Гость
OffTopic:
alex2887 сказал(а):
... переварить очень сложно...
Все мы проходили и проходим через это.
Но слава богу мир не без добрых людей, готовых поделиться своими знаниями.
Почитайте:
- Регулярные выражения - 1 (из справки)
- Регулярные выражения - 2 (из справки)
- Уроки по работе с Регулярными Выражениями (RegExp)
- Регулярные выражения. (Дж. Фридл)
 

Vintets

Новичок
Сообщения
12
Репутация
4
Alofa сказал(а):
alex2887, Vintets
t2319.gif

Кто-нибудь из вас Это пытался изучить?

А что не так? Рег выражение часто можно сделать несколькими способами.
Точнее я конечно вижу что у меня неправильно обрабатывает окончания, это из-за того, что в примере окончания были только с мягким знаком и я поторопился.

Но и твой пример не идеален. Как минимум
(?i) не учитывать регистр символов. Это работает только для символов латинского алфавита.
и у меня (?i), на моей версии реально не работает.

И что твой вариант сделает с совсем не медведями, допустим, "марвекс" или кинокомпанией "марвел", или кровожадной тварью "Мурвен"?


Для RegExp только тестирование, тестирование и всё равно дураком помрёшь :smile: ;D.
 
A

Alofa

Гость
OffTopic:
Vintets сказал(а):
... А что не так?..
http://autoit-script.ru/autoit3_docs/functions/StringRegExp.htm сказал(а):
Часть шаблона, заключенная в квадратные скобки, называется символьным классом. Внутри скобок метасимволы теряют свое специальное значение, кроме метасимволов, принадлежащих этому классу.
Под ваш шаблон подходит такое слово как "|||ве|ь".

Vintets сказал(а):
... Но и твой пример не идеален...
Я в этом даже и не сомневаюсь.
 
Верх