Следующее решение будет работать на PowerShell (v3 или выше) или PowerShell Core.
$wordToAdd = "/Sunday"
$StringBefore = "hello word1 href=""https://youtube.ca/aaa"" hello word2 href=""https://google.com/aaa"" "
$StringBefore -replace '(?<=href="+)(?<uri>[^"]+)',"`${uri}$wordToAdd"
Объяснение:
-replace
использует сопоставление регулярных выражений, за которым следуетзамена группы захвата строк и регулярных выражений. Ниже приведена разбивка соответствия регулярному выражению:
(?<=href="+)
: используется положительное утверждение за утверждением (?<=)
для буквенной строки href=
и "
один или несколько раз (+
). (?<uri>[^"]+)
: использует именованную группу перехвата (?<uri>)
для сопоставления с не двойными кавычками [^"]
один или несколько раз. ${uri}
: синтаксис, необходимый для доступа к группе перехвата uri
,Обратите внимание на обратную черту, поскольку она не является переменной , поэтому мы хотим, чтобы PowerShell не интерполировал. Это значение должно быть внутри одинарных или двойных кавычек с экранированным символом $
.
В PowerShell v6 или более поздней версии вы можете использовать замену блока сценариев.
$StringBefore -replace '(?<=href="+)[^"]+',{$_.ToString() + $wordToAdd}
Здесь $_
является Match
объектом. Метод ToString()
возвращает совпадение в виде строки, поэтому мы можем легко присоединить к ней другую строку ($wordToAdd
).
Если все ваши URI в строке всегда имеют один и тот же протокол, выможет сделать вашу строку регулярных выражений проще.
$StringBefore -replace 'https://[^"]+',"`$&$wordToAdd"