PowerShell - поиск и изменение нескольких текстов в строке - PullRequest
1 голос
/ 08 мая 2020

У меня есть, например, следующий текст (хранится как $test):

\ u003c / p> \ n \ u003cp \ u003e \ u003c / p> \ n \ u003cimg src = \ " / sites / mysite / SiteCollectionImages / banner.jpg \" alt = \ "\" style = \ "float: none; height: auto; width: auto \" / \ u003e \ n \ u003cp> Больше мяса, меньше отходов, означает большую ценность для вашего доллара. \ u003c / p> \ n \ u003cp> \ u003c / p \ u003e \ n \ u003cp \ u003eПри замене мяса эму в ваших рецептах или при планировании При подаче порций помните, что нежирное мясо эму не дает усадки, как другие виды мяса. Вы получаете больше того, за что платите, без костей, внешнего жира или хрящей. Мясо эму очень стабильно при хранении, особенно в вакуумной упаковке. Правильно упакованное в вакууме мясо будет хранить fre sh в вашем холодильнике до 4 недель и до 6-9 месяцев в морозильной камере. \ U003c / p> \ n \ u003cp \ u003e \ u003c / p \ u003e \ n \ u003cimg src = \ " / sites / mysite / SiteCollectionImages / lo go .jpg \" alt = \ "\" style = \ "float: none; height: auto; width: auto \" /> \ n \ u003cp> \ u003c / p> \ n \ u003cp \ u003e \ u003c / p \ u003e \ n \ u003cp>

Я хочу обновить выделенный жирным шрифтом текст между img src=\" и \" (что-то вроде /sites/newSite/newLibrary/originalFilename.v2.jpg)

Как мне go делать эти замены в Powershell с помощью регулярного выражения?

Я пробовал $test -replace '(?<=img src=\")(?<imgUrl>\")', ' ' для начала, и даже это не делает для меня никаких замен.


Обновление

Я смог захватить то, что мне нужно было заменить, используя $test -replace '(?<=img src=\\")(.+?)(?=\\")', '$1' (Спасибо @ user1390638)

Я хотел применить функцию к $1 перед заменой, поэтому мне пришлось сделать это, чтобы она работала:

[regex]::Replace($test, '(?<=img src=\\")(.+?)(?=\\")', {param($match) someFunction($match.Groups[1].Value) })

Ответы [ 2 ]

2 голосов
/ 08 мая 2020

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

  • Первая часть регулярного выражения (? <= Img src = \ ") найдет img src = \ "текст внутри вашей текстовой переменной. Обратите внимание, что здесь следует экранировать символ \. </li>
  • Вторая часть регулярного выражения. +? получает все между,? означает нежадный, поэтому он остановится при первом совпадении.
  • Последняя часть регулярного выражения (? = ") означает, что до цитаты.

(?<=img src=\\").+?(?=")

Предполагается, что ваш текст назначен переменной $ text.

$text -replace('(?<=img src=\\").+?(?=")',"/sites/newSite/newLibrary/originalFilename.v2.jpg")

Чтобы заменить несколько текстов, вы можете дважды вызвать -replace, например $ text -replace (...) -replace (...)

1 голос
/ 08 мая 2020

Regex

(?<=img src=\\\").+?(?=\\)

(?<=img src=\\\") # Finds `img src=\` escaping `\` and `"`  
.+?               # Everything between the two outer capture groups  
(?=\\)            # To the next backslash, again escaping the `\`

Если вы хотите сначала захватить URL-адрес, чтобы делать с ним другие вещи, вы можете создать новый объект регулярного выражения для проверки совпадений.

$obj = # Import your text here how you like
$regex = [regex]::new('(?<=img src=\\\").+?(?=\\)')
$matches = $regex.Matches($obj)

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

function Scramble {
    Param(
        [parameter(ValueFromPipeline=$true)][string]$InputObject
    )

    $split = $InputObject -split "/" | Select-Object -Skip 1
    return "/" + (($split | Get-Random -Count $split.Count) -join "/")
}

foreach ($match in $matches) {
    $obj.Replace($match.Value, ($match.Value | Scramble))  # .Net Method here to replace the specific string found. No need for another regex.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...