【问题标题】:Select-String Regex to find string between simple quotesSelect-String Regex 在简单引号之间查找字符串
【发布时间】:2019-01-18 08:13:30
【问题描述】:

我从 invoke-webrequest 中得到以下几行:

numVersion = 'v1.1805.24',
    if(numVersion!="#@numVersion@#" && numVersion!="v1.1805.24") {

从此摘录中,我只需将 numVersion Number 保留在单引号之间 ==> v1.1805.24

但结果我得到了所有行:

numVersion = 'v1.1805.24',
    if(numVersion!="#@numVersion@#" && numVersion!="v1.1805.24") {

代码如下:

$r = Invoke-WebRequest -Uri $url -Method Get
$split_string = $r.content -split "`n"
$raw_version = $split_string | select-string -Pattern 'numVersion' 
$raw_version -match '(.*?[^*])'

【问题讨论】:

  • 试试$r.content -match "(?<=numVersion\s*=\s*')v[0-9.]+"$matches[0] 应该保持正确的值。
  • 您好,感谢您的反馈,糟糕的是,$matches[0] 返回 numVersion = '
  • here,你一定没有使用我写的建议。
  • 我忘记在我的模式中添加 =。现在您的代码运行良好。谢谢

标签: regex powershell-4.0


【解决方案1】:

你可以使用

$r.content -match "(?<=numVersion\s*=\s*')v[0-9.]+"

请参阅regex demo

然后,您需要的值将在$matches[0] 中。或者,您也可以捕获您需要的文本:

$r.content -match "numVersion\s*=\s*'(v[0-9.]+)"

然后,值将在$matches[1]

模式详情

  • (?&lt;=numVersion\s*=\s*') - 匹配但不消耗 numVersion= 的正向后视,其中包含 0+ 个空格,然后是 ' 字符
  • v[0-9.]+ - v 然后是 1 个或多个数字或 . 字符。您可以在此处仅用 [^']+ 替换此模式,但它对当前任务的特定性较低。

【讨论】:

    【解决方案2】:

    最简单的解决方案是:

    $r.content -match  "'([\S]+)'"
    

    带引号的值是$matches[0],不带引号的值是$matches[1]

    【讨论】:

    • '([\S]+)' 通常是一种不太安全的模式。即使它适用于确切的 OP 字符串,如果在 numVersion 之前的某处有一个 '...' 子字符串,它将被返回而不是预期的。
    • 是的,这不是最安全的,它只是给定字符串最简单的。
    猜你喜欢
    • 1970-01-01
    • 2023-02-25
    • 2021-04-18
    • 2013-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 2019-12-21
    相关资源
    最近更新 更多