Заменить на шаблон - PullRequest
       1

Заменить на шаблон

0 голосов
/ 07 января 2019

Я попытался заменить шаблон == на .equals(. Но для закрытия скобки ) я сталкиваюсь с проблемой, поскольку каждый раз картина может отличаться. Так что я должен рассматривать в качестве базовых критериев?

Для приведенного ниже кода шаблон, который я написал, работает нормально, но когда шаблон меняется, например, если сообщение выглядит так: if ((var1 == null) || (var1.equals(""))) { var1 = "id";}, мой код завершается ошибкой.

message = '''if (var1 != null && var1 == "") var1 = null;'''

message = message.replace('==','.equals(')
result = re.sub('\&\&(.+?)\)', '\\1))', message)

Мне нужен шаблон, который может изменять == как .equals() без нарушения переменных и существующего кода.

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Ну, пока я подошел к этому, написав довольно простую функцию, но, конечно, я хотел бы увидеть, какой длинный код вам понадобится, чтобы убедиться, что он работает правильно. Все, что я проверял это против работ. Кстати, я объединил "regex" и "replace", потому что replace это потрясающе

Input

>>> def replace_equals(message):
        import re
        found_equals = list(set(re.findall('[\s]+==[\S\s]*?\)', message)))
        for i in range(len(found_equals)):
            edit_found_equals = found_equals[i].replace(' == ', '.equals(').replace(')', '))')
            message = message.replace(found_equals[i], edit_found_equals)
        print(message)

выход

1.
>>> message = '''if (var1 != null && var1 == "") var1 = null;'''
>>> replace_equals(message)
'if (var1 != null && var1.equals("")) var1 = null;'

2.
>>> message = '''if ((var1 == null) || (var1.equals(""))) { var1 = "id";}'''
>>> replace_equals(message)
'if ((var1.equals(null)) || (var1.equals(""))) { var1 = "id";}'

Основное объяснение

Я использую регулярное выражение (re.findall), чтобы найти каждое вхождение "== [любое количество символов и завершить, когда вы нажмете ')']" и поместить их в список. Я перебираю этот список, редактирую найденную строку, чтобы заменить "==" на ".equals (" и ")" на "))", затем ищу в сообщении оригинальную найденную строку и заменяю ее на новое редактирование той строки, которую я создал.

0 голосов
/ 08 января 2019

Если вы ищете что-то, что будет работать 100% времени, вам нужен синтаксический анализатор языка.

Однако, если я прав, что вы просто пытаетесь выполнить поиск / замену большого массива кода, поэтому приемлемо что-то более 80% (и вы можете исправить все, что пойдет не так), тогда что-то вроде следующего должно соответствовать вашим потребностям:

([a-zA-Z]\w+|[)])(\s*==\s*("[^"]*"|\w+)(?=\s*[|;&)]))

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

$1.equals($3)

Это преобразует некоторый код следующим образом:

if ( foo == "bar" || foo == baz && foo == baz + 1 /*right hand side too complex*/ && bar == baz ){

  foo = baz( "bat" ) == bar;
  foo = bar == baz( "bat" ); // right hand side is too complex
  bar = 77 == 99; // left hand side is not a variable
  bar = bat == 99;
  bar = bat == 99.0; // floats not supported

}

В это:

if ( foo.equals("bar") || foo.equals(baz) && foo == baz + 1 /*right hand side too complex*/ && bar.equals(baz) ){

  foo = baz( "bat" ).equals(bar);
  foo = bar == baz( "bat" ); // right hand side is too complex
  bar = 77 == 99; // left hand side is not a variable
  bar = bat.equals(99);
  bar = bat == 99.0; // floats not supported

}

Вот демонстрация: https://regexr.com/461lm

Обратите внимание, что это не пытается делать более сложные замены, где правая часть == является выражением, но оно будет обрабатывать простые переменные, строки и целые числа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...