Шаблон RegEx для ограничения тире в этих обстоятельствах
Я использую стороннее программное обеспечение для переименования файлов, написанное на Delphi и поддерживающее pascal-script:http://www.den4b.com/?x=products&product=renamer
Приложение позволяет использовать регулярные выражения для переименования файлов. это означает, что если то, что мне нужно сделать с именем файла, не может быть выполнено только с помощью одного RegEx, то я мог бы использовать различные выражения одновременно или также код паскаля для размещения имени файла, пока я не смогу правильно отформатировать имя файла для нужд этого вопрос или что-нибудь еще ...
проблемаМне нужно отформатировать названия файлов песен, как показано ниже, в этих именах файлов "... с участием художникаmsgstr "часть находится справа от строки, мне нужно сопоставить ее и поместить в левую часть строки.
Carbin & Sirmark - Извините Подвиг. SevenerКристьян Кэш Кэш - Take Me Home Feat. Bebe Rexha (отозвать ремикс)Чтобы сделать это простым для понимания, мы могли бы представитьтокенизировать имя файла, как это:
[0]ARTIST [1]DASH [2]TRACK [3]FEAT_ARTIST [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
Затем, что мне нужно сделать с RegEx, это отформатировать имя файла для позиционированияжетоны в этом порядке:
[0]ARTIST [3]FEAT_ARTIST [1]DASH [2]TRACK [4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
Я действительно делаю это, используя этот RegEx:
\ A ([^ -]?) \ S- \ s * (.?) \ S([([]) ((Футы [\ s] |?. Подвигом [\ s] |.. Отличая [\ s]) [^ () {} []] *) ([)]]) (?. +)? \ Z
Замена на:
1 $ 4 - 2 $ 7
Проблема начинается здесь, потому что[0]ARTIST
а также[2]TRACK
токены могут содержать тире, например, это имя файла:
Тогда, поправьте меня, если я ошибаюсь, но я думаю, что это просто невозможно решить каким-либо образом, потому что машина не может предсказать, когда отделить один токен от другого, что такое имя или что нет, потому что Я не могу знать количество тире, которое содержит имя файла.
По этой причине вместо того, чтобы искать совершенство ingenuos, которое могло бы привести к неправильным именам файлов, потому что количество черточек внутри, я предпочитаю искать решение для исключения имен файлов, ограничивая тире, которым выражение должно соответствовать в имени файла.
ВопросВзяв в качестве примера RegEx, который я показал выше, чтобы расширить / улучшить его, как я могу исключить имена файлов, которые содержат[0]ARTIST
или[2]TRACK
жетоны с тире?
... Или, другими словами, как я могу сказать моему RegEx, чтобы не изменять имя файла, когда имя файла содержит более 1 тиредо "... с участием художника"часть? (не после)
В основном, регулярное выражение должно определять,[1]DASH
встречается более одного раза[3]FEAT_ARTIST
, если да, то исключите это имя файла (не изменяйте его)
Я знаю, как ограничить появление группы Regex примерно так([\-]){1}
чтобы соответствовать только 1 вхождению тире, но я не уверен, как реализовать это в выражении, которое я использую.
Просто несколько случайных примеров ...
Один штрих только перед[3]FEAT_ARTIST
так что мы можем знать, когда отделить[0]ARTIST
от[2]TRACK
жетоны.
Один штрих только перед[3]FEAT_ARTIST
так что мы можем знать, когда отделить[0]ARTIST
от[2]TRACK
жетоны. С[4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
.
Один штрих только перед[3]FEAT_ARTIST
так что мы можем знать, когда отделить[0]ARTIST
от[2]TRACK
жетоны. С[4]POSSIBLE_ADDITIONAL_INFO_INSIDE:()[]{}
который также содержит тире.
Один штрих только между[0]ARTIST
[2]TRACK
токены, но имя файла не имеет[3]FEAT_ARTIST
поэтому мы не трогаем это.
Один штрих только между[0]ARTIST
[2]TRACK
жетоны, но[3]FEAT_ARTIST
до[1]DASH
поэтому мы не трогаем это.
[0]ARTIST
есть тире, поэтому мы не можем знать, когда отделить[0]ARTIST
а также[2]TRACK
токены, поэтому Regex должен исключить это, чтобы не изменять это имя файла.
[2]TRACK
есть тире, поэтому мы не можем знать, когда отделить[0]ARTIST
а также[2]TRACK
токены, поэтому Regex должен исключить это, чтобы не изменять это имя файла.
[0]ARTIST
а также[2]TRACK
у токенов есть тире, поэтому мы не можем знать, когда их разделять, поэтому Regex должен исключить это, чтобы не изменять это имя файла.
[0]ARTIST
а также[2]TRACK
токены имеют тире, а также[3]FEAT_ARTIST
не существует, опять же здесь нечего делать.
Я надеюсь, что это помогает понять, что мне нужно.