2016-09-14 1 views
0

Я задал вопрос Matching if all of BCD..n exist after last occurrence of A, вчера, что привело к быстрому и точному ответу (см. regex demo) , Я думал, что могу сделать эту следующую часть самостоятельно, но мне трудно вставить шаблон в конструкторы с перспективой для имитации If-Then-Else Conditional, которые механизм Java regex не поддерживает. Вот обновленная постановка задачи:Если существует A, то соответствует всем BCD..n после последнего вхождения A, иначе любой из BCD..n

  • IF «mID00231» существует в исходной строке
    • ТОГДА для последнего вхождения «mID00231» в строке, один или несколько вхождений из каждого из {mID00054, mID00013, mID00008, mID00065} должен следовать за ним (в любой заказ),
  • ИНАЧЕ
    • один или более вхождения любого из {mID00054, mID00013, mID00008, mID00065} должно произойти.

строка источник Matching будет выглядеть как эти:

mID00231mID00008mID00054mID00013mID00065 
mID00231mID00008mID00231mID00054mID00013mID00008mID00065 
mID00054mID00065mID00008 

Пример не матча из-за отсутствующими "mID00065":

mID00231mID00054mID00013mID00008 

Пример не матча из-за последнее вхождение из «mID00231» не следует «mID00054» и «mID00008»:

mID00231mID00013mID00065mID00054mID00008mID00231mID00013mID00065 

Я попытался поставить решение, представленное в regex demo, в «(THEN (? = IF)) | (ELSE (?! IF))« конструкцию с открытым исходным кодом, но до сих пор безумно безуспешно. Любая помощь приветствуется.

+1

Используйте два отдельных тестов регулярных выражений? –

ответ

2
(?:mID00231(?!.*mID00231)(?=.*mID00054)(?=.*mID00013)(?=.*mID00008)(?=.*mID00065))|(?:^(?!.*mID00231)((?=.*mID00054)|(?=.*mID00013)|(?=.*mID00008)|(?=.*mID00065))) 

разбив его:

  • Две альтернативы, разделенной |
    • Первой альтернативой в (?:...)?: создать не-запоминающуюся группу)
      • mID00231 Находит буквальная строка, за которой следует ...
      • (?!.*mID00231) НЕТ возникновение mID00231,
      • (?=.*mID00054) любое вхождение mID00054,
      • (?=.*mID00013) любое вхождение mID00013,
      • (?=.*mID00008) любое вхождение mID00008, И
      • (?=.*mID00065) любое вхождение mID00065
    • Вторая альтернатива в (?:...)
      • ^ якорей матча в начале строки
      • (?!.*mID00231) NO возникновения mID00231, а затем ...
      • Четыре альтернативы в (?:...)
        • (?=.*mID00054) любое вхождение mID00054,
        • (?=.*mID00013) любое происшествие mID00013,
        • (?=.*mID00008) любое вхождение mID00008, ИЛИ
        • (?=.*mID00065) любое вхождение mID00065
Смежные вопросы