Powershell переименовывает файлы, удаляя часть, начиная с подстроки regex - PullRequest
1 голос
/ 28 октября 2019

Я изо всех сил пытаюсь написать ps-код, переименовывающий кучу файлов Excel, сокращая хвосты, которые могут оставить пользователи. Простая замена ничего не делает:

-replace " ([vV]{1}\d{1}\.\d{1})",""

Так что у меня осталось куча вещей.

Имена файлов:

SomeNameSomeNameSome v1.3 written by Paul.xls

AnotherName-Another-V5.6 addendum Quarter3.xls

YetAnother.Another V3.73 updated.xls

Все должны преобразовываться в:

SomeNameSomeNameSome.xls

AnotherName-Another.xls

YetAnother.Another.xls

Так что кто-то может помочь включить это регулярное выражение ([vV]{1}\d{1}\.\d{1}), которое вроде работает как серединаточка, чтобы удалить часть имени после него и сохранить расширение? Спасибо!

Ответы [ 2 ]

3 голосов
/ 28 октября 2019

Это выражение должно работать для того, что вы спрашиваете:

-replace '[\s\-]v\d+\.*\d*.*(?=\.\w+$)', ''

Объяснение выражения

  • [\s\-] соответствует либо одному пробелу, либо литералу -
  • v соответствует литералу v
  • \d+ соответствует одному или нескольким числовым символам в строке. + означает «совпадение на одном или нескольких из предыдущего токена
  • \. совпадение на литерале .
  • \d* аналогично \d+, но * означает «сопоставить ноль или более предшествующего токена»
  • . сопоставить любому символу
  • () означает группу. Думайте об этом как о подвыражении для сопоставления.
  • ?= Положительная стрелка. Сопоставляет группу после основного выражения, не включая ее в результат.
  • \w+ соответствует одному или нескольким символам слова в строке.
  • $ соответствует концу строки или концу строки

Таким образом, в простом английском языке основное выражение предшествует (?=), и совпадение возвращается только в случае совпаденияпроисходит непосредственно перед положительным поиском. В этом случае положительный поиск ищет что-либо, похожее на расширение файла (литерал ., за которым следует любое количество символов слова и конец строки).

1 голос
/ 28 октября 2019

Вы можете использовать совпадение с символом пробела или дефисом, используя класс символов.

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

Примечание , которое можно опустить {1} изшаблон

Используйте группу 1 при замене.

[\s-][vV]\d+(?:\.\d+)?.*(\.xls)$

По частям

  • [\s-] Соответствует символу пробела или -
  • [vV] Соответствует v или V
  • \d+(?:\.\d+)? Соответствует 1+ цифрам с необязательной десятичной частью
  • .* Соответствует 1+ раз любому символу, кроме новой строки
  • (\.xls) Совпадение .xls или использование (\.\w+) для сопоставления символов 1+
  • $ Конец строки

Например

$Strings = @("SomeNameSomeNameSome v1.3 written by Paul.xls", "AnotherName-Another-V5.6 addendum Quarter3.xls", "YetAnother.Another V3.73 updated.xls")
$Strings -replace '[\s-][vV]\d+(?:\.\d+)?.*(\.xls)$','$1'

Regex demo | Демонстрация Powershell

Вывод

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