Я пытаюсь реализовать условие «if-else» регулярного выражения.

Я видел много примеров, показывающих формат, как показано ниже (?(?=regex)then|else).

Итак, я попробовал: (?(?=a)1|2).

Насколько я понимаю (чего я ожидал): если есть 1, за которым следует (положительный взгляд в будущее) a, совпадение !. В противном случае найдите 2 и посмотрите, есть ли совпадение.

Входные данные выглядят так, как показано ниже, я ожидал, что будет выделено 1, но оказалось, что это 2.

1a
2a

Может кто-нибудь сказать мне, почему?

Спасибо

1
Joe 25 Сен 2018 в 12:01

2 ответа

Лучший ответ

(?(?=abc)1|2) - это условная проверка успешности положительного просмотра вперед.

Итак, сначала он проверяет, следует ли за текущей позицией abc. Если это правда, сопоставьте 1. Это противоречит положительному просмотру вперед, потому что, если abc следует за текущей позицией, вы не сможете сопоставить 1.

2a соответствует 2, потому что положительный просмотр вперед не выполняется, поэтому механизм пытается сопоставить 2.

С другой стороны, (?(?=abc)a|2) будет соответствовать a в abc. Демо.

3
Michał Turczyn 25 Сен 2018 в 09:07

Из regular-expressions.info:

Специальная конструкция (?ifthen|else) позволяет создавать условные регулярные выражения. Если часть if оценивается как true, то механизм регулярных выражений попытается сопоставить часть then . В противном случае вместо этого используется часть else .

Итак, регулярное выражение (?(?=a)1|2) работает следующим образом:

  • Если следующий символ справа - a
  • Затем попытайтесь сопоставить и использовать 1 (неудача гарантирована, поскольку 1! = a)
  • В противном случае попробуйте сопоставить 2.

Что вам нужно, это простое чередование с опережением после 1, чтобы ограничить его контекст:

(1(?=a)|2)

Будет соответствовать

  • 1(?=a) - 1, если за ним следует a
  • | - или
  • 2 - совпадение 2.
1
Wiktor Stribiżew 25 Сен 2018 в 10:22