REGEX соответствует "Track", но не следует, если за ним следуют 2 числа - PullRequest
0 голосов
/ 28 июня 2019

Что мне нужно, так это регулярное выражение этого утверждения:

match "Artist - Альбом (Год) (дорожка , но только если после пробела есть 2 цифры.

Я понятия не имею, как / если это можно сделать. Я слишком долго работал над этим, и мне жаль, если я пропустил что-то простое, но я попытался найти ответ, прежде чем обратиться за помощью. Это то, как я дошел до того, что я сделал, что для некодера, вероятно, элементарно.

Вот мой сценарий и то, что я пробовал:

"Artist - Album (Year) (Track 01).mp3"
"Artist - Album (Year) (Track 2).mp3"
...
"Artist - Album (Year) (Track 10).mp3"

Match:

".*\(track   

Заменить:

track

Вот что он делает:

track01).mp3"
track2).mp3"
...
track10).mp3"

По сути, это соответствует всему, начиная с открытой цитаты и включая (Трек пробел . Это прекрасно работает для этого. Обратите внимание, что перед открытыми кавычками могут быть некоторые важные вещи, которые мне нужно сохранить. Первая цитата важна как начало матча.

Однако, если я заменю на track , у меня останется track # для любой строки без 2 цифр после матча. Всем им нужно 2 цифры (track08, track09, track10 и т. Д.). Поэтому мне нужен способ сопоставления "Artist - Album (Year) (Track ), но только если после пробела есть 2 цифры. Таким образом, он будет игнорировать строки, которые не соответствуют этому условию, и я могу замените их на track0 на следующем шаге, но указав количество цифр после пробела как 1.

Чего я не хочу, так это потерять эти цифры. Я смог сопоставить только строки, содержащие 2 цифры, но он также соответствует этим 2 цифрам и заменяет их. Это не сработает, они мне нужны!

Вот что я хочу (чего я не против, выполняя поэтапно):

track01.mp3
track02.mp3
...
track10.mp3

Обратите внимание, что я любитель. Я понятия не имею, что такое положительное прогнозное утверждение, или что когда-либо использовал жаргон для объяснения решения. Прошу прощения за мое невежество, я пытаюсь.

Ответы [ 3 ]

1 голос
/ 29 июня 2019

Если вы решите сделать это за 2 прохода, это можно сделать следующим образом.

Пропуск 1:

Найти (?i)".*?Track[ \t]*(\d)(?!\d).*?(\.\w+).*?"
Заменить Track0$1$2

https://regex101.com/r/pLCog5/1

Пропуск 2:

Найти (?i)".*?Track[ \t]*(\d\d)(?!\d).*?(\.\w+).*?"
Заменить Track$1$2

https://regex101.com/r/wh8PmX/1

0 голосов
/ 29 июня 2019

Лол ... после того, как я упомянул, я не знаю, каково было положительное утверждение вперед, я посмотрел его и обнаружил, что это то, что мне нужно. Я попытался добавить (?=\d{2}) и немного поиграть с ним, чтобы получить что-то, что сработало. Похоже, Наткнулся на решение сразу после того, как спросил ... закон Мерфи.

".*track.(?=\d{2}) сработало, но благодаря найденным мною предложениям .*track\s+(?=\d{2}) лучше, так как ловит более одного пробела.

Спасибо за быструю и непредвзятую обратную связь.

0 голосов
/ 28 июня 2019

Я предполагаю, что, возможно, мы начнем с выражения, такого как

.*\(track\s+([0-9]{2})\)(\S+)

и желаемая двухзначная граница находится в этой группе захвата: ([0-9]{2})

DEMO

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