Замена

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Regex.
Если выбрать в "Что заменять" значение, отличное от "Все", не работает замена выделенной группы.
Например, ищу случайное {-String.Enter-}([^\[])
заменяю на {-String.Enter-}[{-Variable.inst-}]{-String.Enter-}$1
в итоге в тексте в тексте вместо первого символа прописывается $1
Как выкрутиться? Баг?
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Нужен пример Txt файла и семпла с ним. Вряд ли баг
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Простенький пример
 

Вложения

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
А выкрутился такой регуляркой:
(?<=\.){-String.Enter-}(?=[^\[])
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Так это баг или особенность?
Сейчас скачал свой пример и прокрутил на крайней версии - всё так же, не работает замена групп, если выбрать не "Все".
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Дело не в нахождении, а в замене,
первый экшн меняет как надо - один-три, а остальные буквально на $1$2
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Замена производится на то текстовое значение, которое указано.
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Так, ещё раз.
У меня замена regex, в первом варианте работает замена групп.
Текст для обработки - один-два-три . Регулярка (.*?)-.*?(-.*) - замена на $1$2, результат - один-три.
Работает, если искать Все совпадения, в остальных случаях нет.
А вопрос всё тот же - баг или нет, что не работает замена при поиске первого совпадения, последнего, случайного или указанного.
 

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Там всего одно совпадение как бы.
И оно заменяется на то значение, которое вы указали.
"На что заменять" это текст.
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Вот, обновил пример:
 

Вложения

  • Спасибо
Реакции: indus

rostonix

Известная личность
Регистрация
23.12.2011
Сообщения
29 067
Благодарностей
5 707
Баллы
113
Фича. Если исправить, шаблоны навернутся у тех кто пользуется таким.
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
В последний раз уточню :-)
Исходный текст:
Код:
один-два-три
два-три-четыре
три-четыре-пять
Меня полностью удовлетворяет такое поведение, когда ищем
Код:
(.*?)-.*?(-.*)
в режиме Regex заменяем на
Код:
$1$2
и получаем
Код:
один-три
два-четыре
три-пять
Теперь вопрос, почему такие замены на $1$2 не действуют, если выбираем номер совпадения?
Допустим выбрали последнее совпадение, т.е. "три-четыре-пять", но в итоге после замены получим не
Код:
три-пять
а буквально
Код:
$1$2
 
  • Спасибо
Реакции: ZennoScript

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
Если надо только последнее заменить, можно использовать такой regex:
Код:
(.*?)-.*?(-.*)$
Regex.png
 
Последнее редактирование:

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
А если случайное? )
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
А если случайное? )
Regex, не может заменять случайные вхождения, если надо именно случайные то можно сниппетом, например:
C#:
string str = project.Variables["string_to_replace"].Value;
Random random = new Random();
System.Text.RegularExpressions.Regex re = new System.Text.RegularExpressions.Regex(@"(.*?)-.*?(-.*)");
str = re.Replace(str, match => {
    int rnd = random.Next(2);
    return rnd == 1 ? match.Value :
        String.Format("{0}{1}",match.Groups[1].Value,match.Groups[2].Value);
});

return str;
 
Последнее редактирование:
  • Спасибо
Реакции: LmPopo

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Спасибо. Пригодится сниппет. Один нюанс. Сейчас щёлкал в PM - на вход подал 3 строчки, и иногда не производил ни одной замены. Что изменить, чтоб выходило от 1 замены и больше?

А вообще, когда говорил о случайном совпадении имел ввиду одно:

upload_2014-12-25_18-51-38.png
 

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Если надо только последнее заменить, можно использовать такой regex:
Код:
(.*?)-.*?(-.*)$
А если последнее совпадение будет не буквально в последней строке, то не заменится, напр. здесь:
Код:
один-два-три
два-три-четыре
три-четырепять
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
Спасибо. Пригодится сниппет. Один нюанс. Сейчас щёлкал в PM - на вход подал 3 строчки, и иногда не производил ни одной замены. Что изменить, чтоб выходило от 1 замены и больше?
Зависит от того где именно нужны замены, можно например всегда заменять первое вхождение, и остальные заменять рандомно, можно подсчитать количество вхождений, и делать замену исходя из этого количества и т.п.


А если последнее совпадение будет не буквально в последней строке, то не заменится, напр. здесь:
Код:
один-два-три
два-три-четыре
три-четырепять
Если не в буквально последней, надо смотреть по ситуации, тот регексп что вы дали, слишком расплывчатый, он гребет под себя все что хочешь, именно для этого варианта можно сделать так:
Код:
(.*)-.*?(-.*\n)(?=.*$)
 
Последнее редактирование:

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Благодарностей
136
Баллы
43
Я же просто предоставил регулярку в качестве примера, что не работает замена на группы при выборе конкретного совпадения, а не всех подряд.
Изначально не знаю в какой строке будет первое, последнее или указанное совпадение.
 

Adigen

Client
Регистрация
28.07.2014
Сообщения
825
Благодарностей
651
Баллы
93
Без дополнительных телодвижений регулярка так делать не умеет, думаю поэтому и не работает, хотя возможно я и ошибаюсь.
Гуру регулярок отзовитесь ))
 

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)