Код переформатирования с регулярными выражениями

У нас есть ArrayList элементов в нескольких классах, которые приносят мне проблемы каждый раз, когда я хотел бы вставить новый элемент в список. С моей стороны было ошибкой разрабатывать классы так, как я делал, но изменение дизайна теперь было бы скорее головной болью, чем это стоит (бюрократическая модель водопада). Я должен был предвидеть изменения формата в документах, которые клиент поставлял нам водопад будь проклят.

Я хотел бы написать простой скрипт в python, который входит в класс, добавляет элемент в список и затем увеличивает все результаты поиска для следующих элементов. Это не очень объяснимо:

 Foo extends Bar{ public Foo(){ m_Tags.add("Jane"); m_Tags.add("Bob"); m_Tags.add("Jim"); } public String GetJane() { return m_ParsedValue.get( m_Tags.get(1) ); } public String GetBob() { return m_ParsedValue.get( m_Tags.get(2) ); } public String GetJim() { return m_ParsedValue.get( m_Tags.get(3) ); } } 

Вы видите, хочу ли я добавить значение между «Jane» и «Bob», тогда мне нужно увеличить число целых чисел в функциях Get *. Я просто хочу написать простой скрипт в Python, который выполняет эту работу для меня. Кто-то, кого я очень уважаю, предлагал regex.

Редактировать:

Да, LinkedHashMap. Так просто, так просто и так не в дизайне сейчас. Я ненавижу водопад. Ненавижу это со страстью. Весь этот бит был «небольшой» и «легкой» частью, которая «не должна тратить много времени на разработку». Я сделал ошибки. Теперь он застрял в камне.

4 Solutions collect form web for “Код переформатирования с регулярными выражениями”

Вы хотите, чтобы ваше регулярное выражение было таким же гибким, как и компилятор, в отношении пробелов между токенами. Выполнение этого и подражание использованию пробелов делает шаблон довольно грязным. Код ниже (извините: Perl, а не Python) редактирует исходные файлы на месте.

 #! /usr/bin/perl -i.bak use warnings; use strict; my $template = '^( public String Get)(\w+)( \( \) { return m_ParsedValue . get \( m_Tags . get \( )(\d+)( \) \) ; } )$'; $template =~ s/ +/\\s*/g; $template =~ s/(\r?\n)+/\\s+/g; my $getter = qr/$template/x; die "Usage: $0 after new-name source ..\n" unless @ARGV >= 3; my $after = shift; my $add = shift; my $index; while (<>) { unless (/$getter/) { print; next; } my($abc,$name,$lmno,$i,$xyz) = ($1,$2,$3,$4,$5); if (defined $index) { print join "" => $abc, $name, $lmno, ++$index, $xyz; } else { if ($name eq $after) { $index = $i; print; print join "" => $abc, $add, $lmno, ++$index, $xyz; } else { print; } } } 

Например,

  $ ./add-after Jane Foo code.java
 $ cat code.java
 Foo расширяет Bar {
     public Foo () {
         m_Tags.add ( "Джейн");
         m_Tags.add ( "Боб");
         m_Tags.add ( "Jim");
     }

     public String GetJane () {return m_ParsedValue.get (m_Tags.get (1));  }
     public String GetFoo () {return m_ParsedValue.get (m_Tags.get (2));  }
     public String GetBob () {return m_ParsedValue.get (m_Tags.get (3));  }
     public String GetJim () {return m_ParsedValue.get (m_Tags.get (4));  }
 } 

Не делайте этого с регулярным выражением. Создавайте символические константы (используя, например, перечисление), которые отображают имена в числа.

Комментарии о разной практике – вот код, который вы задали на языке, который вы просили. Лучше всего, если вы будете поддерживать систему таким образом, вероятно, было бы сделать эти java-файлы автоматически генерируемыми в самом процессе сборки – вы просто сохраните список имен в TXT-файле в каталоге. Этот сценарий подходит для этого.

(Он не будет изменять ваши файлы, он будет генерировать новые, основываясь на шаблоне, который вы разместили здесь)

 import re, sys template = """Foo extends Bar{ public Foo(){ %s } %s } """ tag_templ = """ m_Tags.add("%s");""" getter_templ = """ public String GetJane() { return m_ParsedValue.get( m_Tags.get(%d) ); }""" def parse_names(filename): data = open(filename).read() names = re.findall(r'm_Tags\.add\("(.*?)"', data) return names def create_file(filename, names): tag_lines = [tag_templ % name for name in names] getter_lines = [getter_templ % (i + 1) for i in range(len(names))] code = template % ("\n".join(tag_lines), "\n".join(getter_lines)) file = open(filename,"wt") file.write(code) file.close() def insert_name(after, new_name, names): names.insert(names.index(after) + 1, new_name) if __name__ == "__main__": if len(sys.argv ) < 4: sys.stderr.write("Usage: changer.py <filename> <name-before-insertion> <new-name>") sys.exit(1) filename, name_before, new_name = sys.argv[1:] names = parse_names(filename) insert_name(name_before, new_name, names) create_file(filename, names) 

Я делаю это (ну, что-то очень похожее) прямо сейчас, но используя макросы Excel и VBA. Все бизнес-ценности организованы и заказываются в электронной таблице. Мне просто нужно нажать кнопку, чтобы создать соответствующий код для выбранных ячеек, а затем скопировать-вставить в среду IDE. Еще лучше, у меня есть несколько «столбцов кода» для каждой строки. Некоторые из них генерируют запросы, некоторые преобразования XSL и некоторые процедуры. Для одной строки бизнес-данных я могу легко получить все три типа сгенерированного кода.

Я нашел это (сгенерировать) намного проще, чем переформатировать существующий код, который у меня был.

  • Регулярное выражение, соответствующее многострочному блоку текста
  • Получение значения атрибутов href во всех тегах <a> в html-файле с помощью Python
  • Регулярное выражение Python findall *
  • к какой группе относится обратная ссылка, когда используется операция sub ()?
  • Использование целых чисел / дат в качестве терминалов в парсере NLTK
  • Поиск и замена -. Sub (замена, строка ) - не работает со специальными символами
  • Увеличьте регулярное выражение C ++.
  • Могу ли я найти элемент с использованием регулярного выражения с Python и Selenium?
  • Python - лучший язык программирования в мире.