Итак, у меня есть этот скрипт PowerShell, который заменит URL-адрес Youtube, заменив "https://www.youtube.com/watch?v = " на "id = " без удаления идентификатора URL-адреса.
пример:
переменная copyboard перед: https://thewikihow.com/video_FigUL6NWtqw
переменная copyboard тогда: id=FigUL6NWtqw
Вот что я уже пробовал:
пауэршелл
$Copyboard = Get-Clipboard | Out-String
$Copyboard = $Copyboard -replace "https://www.youtube.com/watch?v = ", "id = "
Позвольте мне дать вам стандартный совет новичкам: если ответ решает вашу проблему, пожалуйста, примите его, нажав большую галочку (✓) рядом с ним, и, при желании, также проголосуйте за него (для этого требуется не менее 15 очков репутации). ). Если вы нашли другие ответы полезными, проголосуйте за них. Принятие (за что вы получите 2 очка репутации) и голосование помогут будущим читателям. См. эта статья для получения дополнительной информации. Если на ваш вопрос еще нет полного ответа, оставьте отзыв или самостоятельный ответ.





Для достижения результатов можно использовать оператор Regex -Replace. Это заменяет все до первого символа = на id.
$Copyboard = $Copyboard -Replace "^[^=]+","id"
Используя оператор -Split, вы можете добавить id= к значению запроса. Я разделяю символ = в качестве разделителя и возвращаю все данные после = с индексом [1]. Здесь я использовал оператор формата (-f), но вы можете использовать любой метод конкатенации на ваш выбор.
$Copyboard = "{0}{1}" -f 'id=',($Copyboard -Split " = ")[1]
Альтернативный подход состоит в том, чтобы сначала преобразовать $Copyboard в [uri], что позже откроет другие параметры для вашего кода, только если вы не переназначите $Copyboard с новым значением. Затем получите доступ к свойству (в данном случае query), которое вы хотите изменить, и выведите только это измененное свойство. С помощью объекта uri различные части скопированного uri разбиваются на части, а результирующие части сохраняются как свойства объекта.
Использование оператора регулярного выражения -Replace с объектом uri:
([uri]$copyboard).Query -Replace "^[^=]+","id"
В исходной строке есть несколько символов регулярного выражения, '.' а также '?'. В основном вас смущает вопросительный знак. (без "| вне строки")
$a = 'https://thewikihow.com/video_FigUL6NWtqw'
[regex]::escape('https://thewikihow.com/video_')
https://www\.youtube\.com/watch\?v=
Вы можете использовать экранированную версию:
$a -replace [regex]::escape('https://thewikihow.com/video_'), 'id='
Или обратную косую черту?:
$a -replace 'https://www.youtube.com/watch\?v=', 'id='
Или .net .replace(), который не использует регулярное выражение:
$a.replace('https://thewikihow.com/video_', 'id=')
Похоже, вам просто нужно извлечь последний токен на основе = из входной строки, что проще всего (хотя и не быстрее всего) сделать с помощью оператора -split:
$Copyboard = 'id=' + ((Get-Clipboard -Format Text) -split '=')[-1]
Обратите внимание на использование -Format Text, чтобы убедиться, что текст извлекается из буфера обмена.
Индекс [-1] извлекает элемент прошлой из массива токенов, который получается в результате разделения строки на = с -split '=', что равно FigUL6NWtqw с вашим образцом ввода.
Кстати: здесь нет никакой разницы, но обратите внимание, что -splitоператор PowerShell, в отличие от .NET .Split()метод, разбивается на регулярные выражения и, как правило, более мощный, чем .Split() — см. этот ответ для получения дополнительной информации.
1-й — НЕ используйте
Out-String, так как он иногда добавляет в исходный код такие вещи, как новые строки. плюс, ваш ввод в буфер обмена, вероятно, уже является строкой. ///// 2-й — в вашем URL-адресе есть специальные символы регулярных выражений [например, точка], которые необходимо экранировать, прежде чем вы сможете использовать-replaceна нем. этот оператор использует регулярное выражение. вы можете использовать[regex]::Escape()в URL-адресе ... или вместо этого вы можете использовать строковый метод.Replace()- он НЕ использует регулярное выражение. плюс есть и другие способы... например, разделение строки. [ухмылка]