Задача на регулярные выражения
От: igor-booch Россия  
Дата: 25.10.18 15:46
Оценка:
Нужно написать регулярное выражение для поиска и замены.

Примеры:

var1 const1 var2 var2.var3 var2.var4 var2.var5

должно замениться на

var1.var3 var1.var4 var1.var5 const1




var10 const1 var20 var20.var3 var20.var40

должно замениться на

var10.var30 var10.var40 const1



То есть
1. Нужно взять первую строку после const1 ограниченную пробелами (var2 или var20)
2. Во второй и последующих строках после const1 ограниченных пробелами (var2.var3 var2.var4 var2.var5 и var20.var3 var20.var40) нужно заменить строку из пункта 1 на строку, которая стоит до const1 (var1 и var10)
3. const1 ставится в конец
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Отредактировано 25.10.2018 16:06 igor-booch . Предыдущая версия . Еще …
Отредактировано 25.10.2018 15:50 igor-booch . Предыдущая версия .
Отредактировано 25.10.2018 15:49 igor-booch . Предыдущая версия .
Отредактировано 25.10.2018 15:48 igor-booch . Предыдущая версия .
Отредактировано 25.10.2018 15:47 igor-booch . Предыдущая версия .
Re: Задача на регулярные выражения
От: Sharov Россия  
Дата: 25.10.18 17:44
Оценка:
Здравствуйте, igor-booch, Вы писали:

А это точно на регулярные выражения задача?

Очень грубо как-то так:

input -- "var1 const1 var2 var2.var3 var2.var4 var2.var5"

regex -- ^(?<bef>.*)(?<c>const1)(?<aft>.*)$

replace exp -- $1$3$2


$1 -- первая группа <bef>
$2 -- вторая группа <c>
$3 -- вторая группа <aft>

Его надобно поотладить, типа условного before и after + разобраться с пробелами. Но начать можно с этого варианта.


Упд.:

Вероятно я слишком просто понял задачу, поэтому скорее мой вариант это не то. Думал надо просто const1 заменить пробелом и отправить в конец. А тут все сложнее. Но думаю и мой способ можно
под решение переделать.
Кодом людям нужно помогать!
Отредактировано 25.10.2018 17:49 Sharov . Предыдущая версия .
Re[2]: Фундаментальных ограничения?
От: igor-booch Россия  
Дата: 25.10.18 18:50
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Здравствуйте, igor-booch, Вы писали:


S>А это точно на регулярные выражения задача?


S>Очень грубо как-то так:


S>input -- "var1 const1 var2 var2.var3 var2.var4 var2.var5"


S>regex -- ^(?<bef>.*)(?<c>const1)(?<aft>.*)$


S>replace exp -- $1$3$2



S>$1 -- первая группа <bef>

S>$2 -- вторая группа <c>
S>$3 -- вторая группа <aft>

К сожалению, такой вариант не подходит. Сложность здесь а том, что количество групп для замены здесь произвольное (в примерах var2 меняется на var1 в 3-х местах, а var20 в 2-х). Возможно такое нельзя сделать с помощью регулярных выражений, и это будет печально. В этом случае хотелось бы услышать от людей имеющих хорошую алгоритмическую подготовку, о фундаментальных ограничениях регулярных выражений, которые не позволяют решить эту задачу.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Отредактировано 25.10.2018 18:51 igor-booch . Предыдущая версия .
Re[2]: Вложенное регулярное выражение
От: igor-booch Россия  
Дата: 25.10.18 18:54
Оценка:
Интуиция подсказывает, что здесь нужно вложенное регулярное выражение. Такое бывает?
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Отредактировано 25.10.2018 18:54 igor-booch . Предыдущая версия .
Re[3]: Фундаментальных ограничения?
От: Sharov Россия  
Дата: 25.10.18 20:20
Оценка: 3 (1)
Здравствуйте, igor-booch, Вы писали:

IB>Здравствуйте, Sharov, Вы писали:


S>>Здравствуйте, igor-booch, Вы писали:


S>>А это точно на регулярные выражения задача?


S>>Очень грубо как-то так:


S>>input -- "var1 const1 var2 var2.var3 var2.var4 var2.var5"


S>>regex -- ^(?<bef>.*)(?<c>const1)(?<aft>.*)$


S>>replace exp -- $1$3$2



S>>$1 -- первая группа <bef>

S>>$2 -- вторая группа <c>
S>>$3 -- вторая группа <aft>

IB>К сожалению, такой вариант не подходит. Сложность здесь а том, что количество групп для замены здесь произвольное (в примерах var2 меняется на var1 в 3-х местах, а var20 в 2-х). Возможно такое нельзя сделать с помощью регулярных выражений, и это будет печально. В этом случае хотелось бы услышать от людей имеющих хорошую алгоритмическую подготовку, о фундаментальных ограничениях регулярных выражений, которые не позволяют решить эту задачу.


Я не большой спец в регулярках, хоть и написал их не мало, но оне все у меня давольно простые. Т.е. какие-то возможности типа lookahead и т.д. не использовал. Так, простейшие основы.
Так вот, что касается произвольного числа групп: если оне не следуют какому-то паттерну, то боюсь ничего не выйдет.
https://stackoverflow.com/a/7854106/241446

Если это не тестовое задание, как я сначала подумал, я бы писал соотв. парсер.

С другой стороны можно посмотреть на MatchEvaluator.
Кодом людям нужно помогать!
Re[4]: Фундаментальных ограничения?
От: igor-booch Россия  
Дата: 26.10.18 12:18
Оценка:
S>Так вот, что касается произвольного числа групп: если оне не следуют какому-то паттерну, то боюсь ничего не выйдет.
Каждая группа это отдельное регулярное выражение, по которому нужно провести поиск и замену. Вот я и подумал про вложенные РВ.

S>Если это не тестовое задание, как я сначала подумал, я бы писал соотв. парсер.

Вообще исходная задача поправить код C#. Нужны РВ, поддерживаемые VS или каким-нибудь текстовым редактором.
Конечно можно написать парсер, но это не интересно, хочется углубить свои знания РВ.
Отвечайте на это сообщение, только если у Вас хорошее настроение и в Вашем ответе планируются только конструктивные вопросы и замечания
http://rsdn.ru/Info/rules.xml
Re[5]: Фундаментальных ограничения?
От: Qulac Россия  
Дата: 26.10.18 21:45
Оценка: 3 (1)
Здравствуйте, igor-booch, Вы писали:

S>>Так вот, что касается произвольного числа групп: если оне не следуют какому-то паттерну, то боюсь ничего не выйдет.

IB>Каждая группа это отдельное регулярное выражение, по которому нужно провести поиск и замену. Вот я и подумал про вложенные РВ.

S>>Если это не тестовое задание, как я сначала подумал, я бы писал соотв. парсер.

IB>Вообще исходная задача поправить код C#. Нужны РВ, поддерживаемые VS или каким-нибудь текстовым редактором.
IB>Конечно можно написать парсер, но это не интересно, хочется углубить свои знания РВ.

Можно попробовать использовать обратные ссылки в регулярке.
Программа – это мысли спрессованные в код
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.