用powershell中的regex替换子字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用powershell中的regex替换子字符串相关的知识,希望对你有一定的参考价值。

我在powershell中有以下正则表达式代码来识别我需要更新的URL:

'href[s]?=[s]?"[^"]*(https://oursite.org/[^"]*News and Articles[^"]*)+"'
'href[s]?=[s]?"[^"]*(https://oursite.org/[^"]*en/News-and-Articles[^"]*)+"'

这些让我得到了我需要更新的结果,现在我需要知道如何用“新闻和文章”替换“新闻和文章”的值和“新闻和文章”的“en”。

我有一些代码有一个替换网址,如下所示:

$newUrl = 'href="https://oursite.org/"' #replaced value 

所以最初的结果是:

https://www.oursite.org/en/News-and-Articles/2017/11/article-name

被替换为

https://www.oursite.org/news-and-articles/2017/11/article-name

这是贯穿所有文章并进行替换的函数:

   function SearchItemForMatch
{
    param(
        [Data.Items.Item]$item
        )
    Write-Host "------------------------------------item: " $item.Name
    foreach($field in $item.Fields) {
        #Write-Host $field.Name
        if($field.Type -eq "Rich Text") {
            #Write-Host $field.Name
            if($field.Value -match $pattern) {
                ReplaceFieldValue -field $field -needle $pattern -replacement $newUrl
            }
            #if($field.Value -match $registrationPattern) {
            #   ReplaceFieldValue -field $field -needle $registrationPattern -replacement $newRegistrationUrl
            #}
            if($field.Value -match $noenpattern){
                ReplaceFieldValue -field $field -needle $noenpattern -replacment $newnoenpattern
            }
        }
    }
}

这是替换方法:

 Function ReplaceFieldValue
    {
        param (
            [Data.Fields.Field]$field,
            [string]$needle,
            [string]$replacement
            )

        Write-Host $field.ID
        $replaceValue = $field.Value -replace $needle, $replacement
        $item = $field.Item
        $item.Editing.BeginEdit()
        $field.Value = $replaceValue
        $item.Editing.EndEdit()
        Publish-Item -item $item -PublishMode Smart

        $info = [PSCustomObject]@{
            "ID"=$item.ID
            "PageName"=$item.Name
            "TemplateName"=$item.TemplateName
            "FieldName"=$field.Name
            "Replacement"=$replacement
        }
        [void]$list.Add($info)
    }
答案

试试Regex:(?<=oursite.org/)(?:en/)?News-and-Articles(?=/)

替换为news-and-articles

Demo

另一答案

原谅我,如果我错过了什么,但在我看来,你真正想要实现的是摆脱/en部分,最后将整个网址转换为小写。

给出您的示例网址,这可能很简单:

$url = 'https://www.oursite.org/en/News-and-Articles/2017/11/article-name'
$replaceValue = ($url -replace '/en/', '/').ToLower()

结果:

https://www.oursite.org/news-and-articles/2017/11/article-name

如果它涉及更复杂的替换,那么请编辑您的问题,并给我们更多的例子和所需的输出。

以上是关于用powershell中的regex替换子字符串的主要内容,如果未能解决你的问题,请参考以下文章

Powershell:替换所有以相同Unicode字符开头的不同子字符串(正则表达式?)

用 Map 中的 RegEx 键替换所有出现的字符串

SQL Regex - 用另一个字段的子字符串替换

正则表达式在java中的应用

Java如何替换所有指定(出现)的字符串?

Java如何计数替换字符串中第一次出现的子字符串?