Замена

  • Автор темы Автор темы LmPopo
  • Дата начала Дата начала

LmPopo

Client
Регистрация
06.12.2012
Сообщения
299
Реакции
136
Баллы
43
Regex.
Если выбрать в "Что заменять" значение, отличное от "Все", не работает замена выделенной группы.
Например, ищу случайное {-String.Enter-}([^\[])
заменяю на {-String.Enter-}[{-Variable.inst-}]{-String.Enter-}$1
в итоге в тексте в тексте вместо первого символа прописывается $1
Как выкрутиться? Баг?
 
Нужен пример Txt файла и семпла с ним. Вряд ли баг
 
А выкрутился такой регуляркой:
(?<=\.){-String.Enter-}(?=[^\[])
 
Так это баг или особенность?
Сейчас скачал свой пример и прокрутил на крайней версии - всё так же, не работает замена групп, если выбрать не "Все".
 
YM1T0P.png
 
Дело не в нахождении, а в замене,
первый экшн меняет как надо - один-три, а остальные буквально на $1$2
 
Замена производится на то текстовое значение, которое указано.
 
Так, ещё раз.
У меня замена regex, в первом варианте работает замена групп.
Текст для обработки - один-два-три . Регулярка (.*?)-.*?(-.*) - замена на $1$2, результат - один-три.
Работает, если искать Все совпадения, в остальных случаях нет.
А вопрос всё тот же - баг или нет, что не работает замена при поиске первого совпадения, последнего, случайного или указанного.
 
Там всего одно совпадение как бы.
И оно заменяется на то значение, которое вы указали.
"На что заменять" это текст.
 
Фича. Если исправить, шаблоны навернутся у тех кто пользуется таким.
 
В последний раз уточню :-)
Исходный текст:
Код:
Развернуть Свернуть Копировать
один-два-три
два-три-четыре
три-четыре-пять
Меня полностью удовлетворяет такое поведение, когда ищем
Код:
Развернуть Свернуть Копировать
(.*?)-.*?(-.*)
в режиме Regex заменяем на
Код:
Развернуть Свернуть Копировать
$1$2
и получаем
Код:
Развернуть Свернуть Копировать
один-три
два-четыре
три-пять

Теперь вопрос, почему такие замены на $1$2 не действуют, если выбираем номер совпадения?
Допустим выбрали последнее совпадение, т.е. "три-четыре-пять", но в итоге после замены получим не
Код:
Развернуть Свернуть Копировать
три-пять
а буквально
Код:
Развернуть Свернуть Копировать
$1$2
 
  • Оценить
Реакции: ZennoScript
Если надо только последнее заменить, можно использовать такой regex:
Код:
Развернуть Свернуть Копировать
(.*?)-.*?(-.*)$
Regex.png
 
Последнее редактирование:
А если случайное? )
 
А если случайное? )
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
Спасибо. Пригодится сниппет. Один нюанс. Сейчас щёлкал в PM - на вход подал 3 строчки, и иногда не производил ни одной замены. Что изменить, чтоб выходило от 1 замены и больше?

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

upload_2014-12-25_18-51-38.png
 
Если надо только последнее заменить, можно использовать такой regex:
Код:
Развернуть Свернуть Копировать
(.*?)-.*?(-.*)$
А если последнее совпадение будет не буквально в последней строке, то не заменится, напр. здесь:
Код:
Развернуть Свернуть Копировать
один-два-три
два-три-четыре
три-четырепять
 
Спасибо. Пригодится сниппет. Один нюанс. Сейчас щёлкал в PM - на вход подал 3 строчки, и иногда не производил ни одной замены. Что изменить, чтоб выходило от 1 замены и больше?

Зависит от того где именно нужны замены, можно например всегда заменять первое вхождение, и остальные заменять рандомно, можно подсчитать количество вхождений, и делать замену исходя из этого количества и т.п.


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

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