2013-02-21 2 views
4

Извините за запутанное название, я не мог придумать правильную формулировку. Я пытаюсь понять, есть ли способ регулярного выражения для соответствия различным строкам, в зависимости от того, была ли захвачена предыдущая группа захвата или нет.Регулярные выражения с двумя аспектами

/th?u(e|r)sday/ 

Это соответствует tuesday, thursday но thuesday и tursday. Есть ли способ указать в регулярном выражении, что часть должна соответствовать только, если предыдущая часть была сопоставлена ​​... поэтому я представляю потенциальный синтаксис, например ... (?#:pattern), где # - это номер из группы захвата, и если захват группа захвачена, затем шаблон включен, в противном случае он пропускается. Аналогичная модель (!#:pattern) для, если #-я группа не захвачена. Этот изобретенный синтаксис должен продемонстрировать, что я пытаюсь сделать. С этим изобретено синтаксисом, я мог бы решить мою проблему выше, как это ...

/t(h)?u(!1:e)(?1:r)sday/ 

Есть ли такой синтаксис регулярных выражений для достижения этого типа ссылок?

ответ

4

Эта функция существует в некоторых регулярных выражений реализаций, и регулярное выражение из вашего примера будет написано так:

/t(h)?u(?(1)r|e)sday/ 

Очевидно, что это не самый лучший пример, поскольку /t(hur|ue)sday/ эквивалентно и гораздо короче , но есть случаи, когда это более полезно.

Ознакомьтесь со вторым по последний элемент в таблице this advanced regex reference page, с дополнительной информацией об условных обозначениях here.

  • Синтаксис:

    (?(1)then|else) 
    
  • Описание:

    Если первая группа записи приняла участие в попытке матч до сих пор, «тогда» часть должна соответствовать для общего регулярного выражения чтобы соответствовать. Если первая группа захвата не принимала участия в матче, часть «else» должна совпадать для соответствия общего регулярного выражения.

  • Пример:

    (a)?(?(1)b|c) соответствует ab, первый c и в babxcac

второй c Согласно той же странице, условными которые поддерживаются JGsoft engine, Perl, PCRE и .NET framework.

1

Почему бы просто не использовать более конкретную дизъюнкцию?

/t(hur|ue)sday/ 
+0

Потому что это надуманный пример, для более общего принципа того, что может быть полезной функцией. Я хочу использовать его как функцию в гораздо более сложных матчах. Это действительно не помогает ответить на мой вопрос ... Я имею в виду, что я мог бы просто «/ tuesday | thursday /» правильно? –

+1

Вот пример использования моей идеи более полезной: '^ ((From | To) | Subject): ((? (2) \ w + @ \ w + \. [A-z] + |.+)) '(от: http://www.regular-expressions.info/conditional.html) –

Смежные вопросы