Условное сопоставление Regex в одной группе захвата - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть строка, которая может иметь вид:

"filename.first_order.png"
"filename.second_order.png"
"filename.png"
"filename.(jpg|tif|etc)"

Мне нужно сопоставить первую часть строки, содержащую имя, и расширение - однако, если строка является первой / Второй тип заказа, мне нужно сопоставить «first_order» / «second_order» в качестве второй группы, а не «png», и я не могу заставить эти два условия сосуществовать в одной группе захвата. Примеры совпадений:

imageondisk.first_order.png -> [imageondisk, first_order]
anotherfile.png             -> [anotherfile, png]
meetingminutes.jpeg         -> [meetingminutes, jpeg]

Мне кажется, что я использовал всевозможные комбинации взглядов, взглядов, взглядов, которые должны выглядеть как беспорядочный необразованный беспорядок, но что бы я ни делал, я никогда не смогу получить результат где они не конфликтуют, когда я присоединяюсь к ним вместе - что бы выглядело примерно как

(.+)\.(tif|jpg|<png when not preceded by first/second_order>|<first/second_order, ignoring the .png on the end>)

За исключением того, что я просто спустился в расстроенную кроличью нору групп без захвата и обходных путей, которые, казалось, заканчивались в одном и том же месте и я чувствую, что знал меньше регулярных выражений, чем раньше.

Помощь была бы очень признательна.

1 Ответ

0 голосов
/ 04 февраля 2020

Вы можете использовать это регулярное выражение, которое захватывает имя файла в группе 1, любую строку первого / второго порядка в группе 2 и расширение в группе 3:

^([^.]+)(?:\.(.+))?\.(png|jpg|tif)$

Демонстрация для регулярного выражения101

...