Войти

Показать полную графическую версию : [решено] Regex работает непонятно


DJ Mogarych
01-09-2023, 22:51
Привет!

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

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

bredych
01-09-2023, 23:33
если нету "а", просто добавить "о"? Ну.. он и добавляет..

NickM
01-09-2023, 23:52
Для этого слова:
"Скопирована" »
Сначала обрабатывается последняя а, которое меняется на о, после обрабатывается ?, т.к. в уже полученном слове а в конце отсутствует, то и добавляется ещё одно о.

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

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

YuS_2
02-09-2023, 10:25
Мне нужно, чтобы регулярка превращала всё в "Скопировано". »
Именно всё? Или таки конкретное слово в конце строки?
чтобы предусмотреть возможные ошибки с наибольшим количеством вариантов с конкретным словом, можно сделать примерно так:
("Скопирован","Скопирована","Скопированаа","Скопирайчено","хренькакая","Скопипастчено что-то","оскопили") -replace '\bскопи[^\n ]*\b$','Скопировано'

DJ Mogarych
02-09-2023, 17:16
Именно всё? »
Всё, что в массиве.

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

YuS_2
02-09-2023, 20:46
Всё, что в массиве. »
Задача разовая? Если массив такой, как в первом сообщении, то подойдет шаблон от Foreigner, если что-то ещё будет в нем, то возможны варианты...

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




© OSzone.net 2001-2012