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

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Regex работает непонятно (http://forum.oszone.net/showthread.php?t=354134)

DJ Mogarych 01-09-2023 22:51 3014987

Regex работает непонятно
 
Привет!

Мне нужно, чтобы регулярка превращала всё в "Скопировано". Почему так работает?
Код:

("Скопирован","Скопирована") -replace 'а?$','о'
Скопировано
Скопированоо


bredych 01-09-2023 23:33 3014990

если нету "а", просто добавить "о"? Ну.. он и добавляет..

NickM 01-09-2023 23:52 3014995

Для этого слова:
Цитата:

Цитата DJ Mogarych
"Скопирована" »

Сначала обрабатывается последняя а, которое меняется на о, после обрабатывается ?, т.к. в уже полученном слове а в конце отсутствует, то и добавляется ещё одно о.

Foreigner 02-09-2023 00:02 3014996

Надо просто отделить окончание строки от вариантов: либо последний символ "a", либо нет (но так, чтобы в этом случае он не захватывался):

Код:

("Скопирован","Скопирована") -replace '(а|(?<!а))$','о'

YuS_2 02-09-2023 10:25 3015001

Цитата:

Цитата DJ Mogarych
Мне нужно, чтобы регулярка превращала всё в "Скопировано". »

Именно всё? Или таки конкретное слово в конце строки?
чтобы предусмотреть возможные ошибки с наибольшим количеством вариантов с конкретным словом, можно сделать примерно так:
Код:

("Скопирован","Скопирована","Скопированаа","Скопирайчено","хренькакая","Скопипастчено что-то","оскопили") -replace '\bскопи[^\n ]*\b$','Скопировано'

DJ Mogarych 02-09-2023 17:16 3015015

Цитата:

Цитата YuS_2
Именно всё? »

Всё, что в массиве.

Цитата:

Цитата NickM
Сначала обрабатывается последняя а, которое меняется на о, после обрабатывается ? »

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

YuS_2 02-09-2023 20:46 3015025

Цитата:

Цитата DJ Mogarych
Всё, что в массиве. »

Задача разовая? Если массив такой, как в первом сообщении, то подойдет шаблон от Foreigner, если что-то ещё будет в нем, то возможны варианты...

Цитата:

Цитата DJ Mogarych
Так вроде бы ? - это один экземпляр предыдущего символа или его отсутствие, почему отдельно обрабатывается? »

не совсем... движок регэкспов работает с возвратами и проверками на лучшее совпадение посимвольно, поэтому получается два соответствия и на наличие символа "а", и на пустую строку "", следующую сразу за символом "а", т.к. шаблон "а?", как раз и дает такое двойное соответствие.
Пронаблюдать можно здесь:
https://regex101.com/r/3UqiIK/1 - просто соответствия (Match 1 и Match 2)
https://regex101.com/r/oWo0L5/1 - соответствия с заменой


Время: 19:31.

Время: 19:31.
© OSzone.net 2001-