В поисках Элвиса? - PullRequest
       13

В поисках Элвиса?

5 голосов
/ 15 июня 2009

Мне было поручено найти Элвиса (используя поиск по затмению). Есть ли какое-нибудь регулярное выражение, которое я могу использовать, чтобы найти его?

«Оператор Элвиса» (?:) является сокращением троичного оператора Java.

Я пробовал \?[\s\S]*[:], но он не соответствует многострочному.
Есть ли такой рефакторинг, где я мог бы превратить Элвиса в блок if-else?

Ответы [ 2 ]

4 голосов
/ 15 июня 2009

Редактировать Извините, я разместил регулярное выражение для троичного оператора, если ваша проблема многострочная, вы можете использовать это:

\?(\p{Z}|\r\n|\n)*:
2 голосов
/ 15 июня 2009

Вам нужно явно сопоставить разделители строк, если вы хотите сопоставить несколько строк. \ R будет соответствовать любому из них (независимо от платформы), в Eclipse 3.4 в любом случае, или вы можете использовать правильный для вашего файла (\ r, \ n, \ r \ n). Например. \?.*\R*.*: будет работать, если будет только один разрыв строки. Вы не можете использовать \ R в символьном классе, поэтому, если вы не знаете, сколько строк может занимать оператор, вам придется создать символьный класс с разделителем строк и любым символом, который может появиться в операнд. Что-то вроде ([-\r\n\w\s\[\](){}=!/%*+&^|."']*)\?([-\r\n\w\s\[\](){}=!/%*+&^|."']*):([-\r\n\w\s\[\](){}=!/%*+&^|."']*). Я включил скобки, чтобы захватить операнды как группы, чтобы вы могли найти и заменить.

Однако у вас довольно большая проблема, если это Java (и, возможно, любой другой язык). Тернарный условный оператор?: Создает выражение, а оператор if не является выражением. Рассмотрим:

boolean even = true;
int foo = even ? 2 : 3;
int bar = if (even) 2 else 3;

Третья строка синтаксически неверна; две условные конструкции не эквивалентны. (Что бы вы на самом деле получили из второй строки, если бы использовали мое регулярное выражение для поиска и замены, это if (int foo = even) 2 else 3;, что имеет дополнительные проблемы.)

Итак, вы можете найти операторы?: С приведенным выше регулярным выражением (или что-то подобное; возможно, я пропустил некоторые символы, которые нужно включить в класс), но вы не обязательно сможете заменить их на «если 'заявления.

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