Условное условие If Else Regex - PullRequest
1 голос
/ 26 февраля 2020

Этот вопрос следует из предыдущего вопроса о регулярных выражениях If-Then-Else.

Из-за того, как я сформулировал свою проблему в других вопросах, решения не использовали ( ? (A) X | Y) синтаксис. Но я думаю, что мне нужно использовать этот подход.

Вот моя перефразированная проблема ...

Мне нужно регулярное выражение, которое принимает в качестве входных данных строку, представляющую имя файла.

Вот мои тестовые строки ...

The Edge Of Seventeen 2016 720p.mp4
20180511 2314 - Film4 - Northern Soul.ts
20150526 2059 - BBC Four - We Need to Talk About Kevin.ts

Если имя файла соответствует этому регулярному выражению:

\d{8} \d{4} -.*?- .*?\.ts

Тогда следует применить этот RegEx:

\d{8} \d{4} -.*?- ?(.*)\.ts

Если имя файла не соответствует первому регулярному выражению, к нему следует применить это регулярное выражение:

(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?

Это ожидаемый результат ...

Тестовая строка: The Edge Of Seventeen 2016 720p.mp4
Ожидаемый результат: «The Edge Of Seventeen 2016» (цитаты включены только для того, чтобы показать, что в конце можно оставить пробел)

Тестовая строка: 20180511 2314 - Film4 - Northern Soul.ts
Ожидаемый результат: Northern Soul

Тестовая строка: 20150526 2059 - BB C Four - нам нужно поговорить о Kevin.ts
Ожидаемый результат: нам нужно поговорить о Kevin

Вот что Я пытался создать регулярное выражение If-Then-Else, но оно не работает:

Я использую этот формат -> (? (A) X | Y)

(?(\d{8} \d{4} -.*?- .*?\.ts)\d{8} \d{4} -.*?- ?(.*)\.ts|(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?)

Это A

\d{8} \d{4} -.*?- .*?\.ts

Это X

\d{8} \d{4} -.*?- ?(.*)\.ts

Это Y

(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9])([ _\,\.\(\)\[\]\-]|[^0-9]$)?

Я проверил регулярные выражения A, X и Y, и они работают индивидуально, но не когда я соединяю их. Может ли кто-нибудь помочь собрать их вместе, используя стандарт PCRE?

Cheers,

Flex

Ответы [ 2 ]

1 голос
/ 28 февраля 2020

Вы можете использовать

^\d{8} \d{4} -.*?- ?\K.*(?=\.ts$)|^.*[^][ _,.()-][][ _.()-]+(?:19|20)\d{2}(?!\d)

См. Демонстрационный пример regex

Шаблон представляет собой комбинацию двух альтернатив и, как и в любом регулярном выражении NFA, первая альтернатива, которая соответствует "wins" и механизм регулярных выражений прекращает анализировать остальные альтернативы на этом уровне:

  • ^\d{8} \d{4} -.*?- ?\K.*(?=\.ts$) - совпадения
    • ^ - начало строки
    • \d{8} \d{4} - - 8 цифр, пробел, четыре цифры, пробел и затем -
    • .*? - 0+ символов, кроме разрывов строк, как можно меньше
    • - ? - - и дополнительный пробел
    • \K - оператор сброса совпадений, который отбрасывает сопоставленный текст в буфере памяти
    • .* - любые символы 0+, кроме символов разрыва строки, как можно больше
    • (?=\.ts$) - для этого положительного просмотра требуется .ts и конец строки непосредственно справа от текущей позиции.
  • | - или, если приведенный выше вариант не совпадает, попробуйте
    • ^ - начало строки
    • * 1 046 * - любые 0+ символов, кроме символов разрыва строки, максимально возможное число
    • [^][ _,.()-] - символ, отличный от ], [, пробел, _, ., (, ) и - символов
    • [][ _.()-]+ - 1+ ], [, пробел, _, ., (, ) и - chars
    • (?:19|20) - 19 или 20 подстрока
    • \d{2}(?!\d) - две цифры, за которыми не следует другая ди git.
1 голос
/ 26 февраля 2020

Продолжая мой ответ здесь -> Как сделать условное выражение If Then Else Regex , тот же метод применим до сих пор. Я протестировал его на Java движке.

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

Regex X: нет ничего. \d{8} \d{4} -.*?- ?(?<x>.*)\.ts

Regex Y: (?<y>(.*[^ _\,\.\(\)\[\]\-])[ _\.\(\)\[\]\-]+(19[0-9][0-9]|20[0-9][0-9]))([ _\,\.\(\)\[\]\-]|[^0-9]$)?

Вам нужно будет выбрать правильную группу для y, поскольку я не думаю, что у меня есть сделал эту часть правильно.

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