Regex для замены булевской переменной bool

Выражение - это что-то, в то время как оператор делает что-то. Выражение также является выражением, но оно должно иметь возврат.

>>> 2 * 2          #expression
>>> print(2 * 2)     #statement

PS: Интерпретатор всегда печатает значения всех выражений.

8
задан Community 23 May 2017 в 12:13
поделиться

9 ответов

s/[^:]\bBoolean\b (?!")/bool/g

Это не соответствует строкам, где булевская переменная является в этом началом строки becuase [^:] "соответствие символ, который не является":.

3
ответ дан 5 December 2019 в 21:24
поделиться

Предостерегитесь с тем соответствующим кавычке предварительным утверждением. Это будет только соответствовать, если булевская переменная будет последней частью строки, но не посреди строки. Необходимо будет соответствовать четному числу меток кавычки, предшествующих соответствию, если Вы захотите быть уверенными, что Вы не находитесь в строке (принимающий многострочные строки и никакие завершенные встроенные метки кавычки).

2
ответ дан 5 December 2019 в 21:24
поделиться
s/[^:]\bBoolean\b[^"]/bool/g

Править: Крысы, избитые снова. +1 для избиения меня, хорошего сэра.

1
ответ дан 5 December 2019 в 21:24
поделиться
#define Boolean bool

Позвольте предварительному переработчику заботиться об этом. Каждый раз, когда Вы видите булевскую переменную, можно или вручную зафиксировать ее или надеяться, что regex не делает ошибку. В зависимости от того, сколько макросов Вы используете Вас, может, Вы могли вывести из cpp.

1
ответ дан 5 December 2019 в 21:24
поделиться

Зафиксировать условие 1 попытка:

s/[^:]\bBoolean\b(?!")/bool/g

[^:] говорит для соответствия любому символу кроме ":".

0
ответ дан 5 December 2019 в 21:24
поделиться

3) Не соответствуйте, если посреди строки (благодарит nohat).

Можно, возможно, записать reg исключая проверить ".*Boolean.* ". Но что, если у Вас есть кавычка (") в строке? Так, у Вас есть больше работы для не исключения (\") шаблона.

4) Не соответствуйте если в комментарии. (//или/* */)

Для '//', у Вас может быть regex для исключения//.* Но, лучше мог быть для первого помещения regex для сравнения целой строки для//комментарии ((.*) (//.*)), и затем применяют замену только на 1$ (сначала соответствие шаблону).

Для/* */, это более сложно, поскольку это - многострочный шаблон. Один подход может быть к первому показу всем, Вы кодируете, чтобы соответствовать многострочным комментариям и затем вынуть только части, не соответствующие... чему-то как... (.*) (/*. **/) (.*). Но, фактический regex был бы еще более сложным, как Вы будете иметь не один, но больше многострочных комментариев.

Теперь, что, если у Вас есть/* или */внутри//блок? (Я не знаю, почему у Вас был бы он.. но в законе Murphy's говорится, что у Вас может быть он). Существует, очевидно, некоторый выход, но моя идея состоит в том, чтобы подчеркнуть, как непривлекательный regex станет.

Мое предложение здесь состояло бы в том, чтобы использовать некоторый лексический инструмент для C++ и заменить маркерную булевскую переменную bool. Ваши мысли?

0
ответ дан 5 December 2019 в 21:24
поделиться

Чтобы постараться не писать полный синтаксический анализатор C в жемчуге, Вы пытаетесь установить равновесие. В зависимости от того, сколько изменения потребностей, я был бы склонен сделать что-то как очень строгий s///и затем что-либо, что все еще соответствует/Boolean/, записан в файл исключения для человеческого принятия решений. Тем путем Вы не пытаетесь проанализировать средние строки C, многострочный комментарий, условное выражение, скомпилированное текст, и т.д. который мог присутствовать.

0
ответ дан 5 December 2019 в 21:24
поделиться
  1. Не соответствуйте, если посреди строки (благодарит nohat).
  2. Не соответствуйте если в комментарии. (//или / **/)

Нет может сделать с простым regex. Для этого необходимо на самом деле посмотреть на каждый символ слева направо и решить, какая вещь это, по крайней мере, достаточно хорошо для сообщения независимо комментариев из многострочных комментариев от строк от другого материала, и затем необходимо видеть, содержит ли “другой материал” часть вещи, Вы хотите измениться.

Теперь, я не знаю точные синтаксические правила для комментариев и строк в C++, таким образом, следующее будет неточным и полностью неотлаженным, но это даст Вам общее представление о сложности, против которой Вы противостоите.

my $line_comment      = qr! (?> // .* \n? ) !x;
my $multiline_comment = qr! (?> /\* [^*]* (?: \* (?: [^/*] [^*]* )? )* )* \*/ ) !x;
my $string            = qr! (?> " [^"\\]* (?: \\ . [^"\\]* )* " ) !x;
my $boolean_type      = qr! (?<!:) \b Boolean \b !x;

$code =~ s{ \G (
      $line_comment
    | $multiline_comment
    | $string
    | ( $boolean_type )
    | .
) }{
    defined $2 ? 'bool' : $1
}gex;

Не просите, чтобы я объяснил это во всей его запутанности, мне потребовались бы день и другой. Просто купите и считайте Регулярные выражения Освоения Jeff Friedl, если Вы хотите понять точно, что продолжается здесь.

0
ответ дан 5 December 2019 в 21:24
поделиться

"'Булевская переменная' посреди строки" часть звучит немного маловероятной, я проверил бы сначала, существует ли какое-либо возникновение ее в коде с чем-то как

m/"[^"]*Boolean[^"]*"/

И если нет ни одного или некоторых, просто игнорируйте тот регистр.

0
ответ дан 5 December 2019 в 21:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: