【问题标题】:PowerShell - Finding and modifying multiple text in stringPowerShell - 查找和修改字符串中的多个文本
【发布时间】:2020-08-23 10:54:42
【问题描述】:

例如,我有以下文本(存储为$test):

\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"/sites/mysite/SiteCollectionImages/banner.jpg\" alt=\"\" 样式=\“浮动:无;高度:自动;宽度: auto\"/\u003e\n\u003cp\u003e更多的肉,更少的浪费,意味着更多的价值 为您 美元。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e当 在您的食谱中替代鸸鹋肉或计划您的服务 部分,请记住,低脂鸸鹋肉不会像 其他肉类。你得到更多你付出的没有骨头,外部 脂肪,或软骨。鸸鹋肉在货架上非常稳定,尤其是在真空的情况下 包装。正确真空包装的肉类将保持新鲜 冰箱长达 4 周,您的冰箱长达 6-9 个月 冰箱。\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cimg src=\"/sites/mysite/SiteCollectionImages/logo.jpg\" alt=\"\" 样式=\“浮动:无;高度:自动;宽度: 自动\"/\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e\u003c/p\u003e\n\u003cp\u003e

我想更新img src=\"\" 之间的粗体文本(类似于/sites/newSite/newLibrary/originalFilename.v2.jpg

我将如何使用正则表达式在 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) })

【问题讨论】:

  • 更新了我的答案,将“争夺”功能应用于比赛。

标签: regex powershell


【解决方案1】:

您的正则表达式错误,要匹配您之间的字符串,应使用以下正则表达式。

  • 正则表达式的第一部分 (?
  • 正则表达式的第二部分 .+?得到之间的一切,?表示非贪婪,所以它会在第一场比赛停止
  • 正则表达式的最后一部分 (?=") 表示直到引用为止。

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

假设您的文本已分配给 $text 变量。

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

要替换多个文本,基本上可以调用两次 -replace 如 $text -replace(...) -replace(...)

【讨论】:

  • 我明白了,但我仍然想捕捉比赛,因此我使用&lt;imgUrl&gt;,这样我就可以在原版的基础上对替换进行一些修改。我该怎么办?基本上,替换文本将是某个函数的参数,它会给出新的图像 URL……所以我在想像$test -replace [pattern&lt;imgUrl&gt;], someFunction(imgUrl) 这样的东西。这甚至可能吗?
  • 如果你想做的是在输入上调用函数,你可以在调用replace之前将结果赋给一个像$scrambled_url = scramble('$1')这样的变量,然后在你的replace中使用这个$scrambled_url变量函数-replace('your pattern', $scrambled_url ) 如果这是你想做的。
  • 如果你想在匹配的url上调用函数,首先你可以用-match$text -match '(?&lt;=img src=\\").+?(?=")'得到匹配的url,一旦你调用match,-match操作符会设置一个特殊的变量叫做$matches。您可以从此变量中获取匹配的字符串并调用您的函数 $scrambled_url = someFunction(-matches[0]) 。之后,您可以使用此 $scrambled_url 调用替换函数,就像我在上面的评论中一样。
【解决方案2】:

正则表达式

(?<=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.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-29
    • 2020-02-11
    • 1970-01-01
    • 2021-06-04
    • 2016-03-22
    • 2021-05-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多