【问题标题】:Extracting specific data from a string with regex and Powershell使用正则表达式和 Powershell 从字符串中提取特定数据
【发布时间】:2018-09-18 04:43:53
【问题描述】:

我想从这个字符串中提取

阻塞进程报告 进程 id="process435d948" taskpriority="0" logused="0" waitresource="RID: 7:1:1132932:0" waittime= "3962166" ownerId="4641198" transactionname="SELECT" lasttranstarted="2011-09-13T17:21:54.950" XDES="0x80c5f060" lockMode="S" schedulerid="4" kpid="18444" status="susp 结束” spid="58" sbid="0" ecid="0"

粗体的值,但只有值或58。这个值可以是不同的值,有时是80或1000等,但总是> 50。

如何使用 regex 和 posh 做到这一点?

【问题讨论】:

    标签: regex powershell


    【解决方案1】:

    又快又脏:

    $found = $string -match '.*spid="(\d+)".*'
    if ($found) {
        $spid = $matches[1]
    }
    

    $string 是您上面提到的字符串。这将匹配任何具有 spid="somenumberhere" 的字符串,并将数字放入匹配组,您可以使用 $matches[1] 提取该组。

    【讨论】:

    • 为什么所有的.* 都在正则表达式中?
    • .* 将匹配该行之前和之后的任何内容,仅当您使用 '^.*spid="(\d+)".*$' 时才真正需要
    • 您可以将它们排除在外,不确定这两种方式对性能的影响。将它们排除在外可能会更清洁/更快,并没有考虑太多。
    • 并在文本中获取所有推特用户名? jes.al/2009/05/…
    • .* 通常不应该在正则表达式中使用,结果可能无法预测并且性能很慢,因为它会在回溯之前匹配整个字符串以查找正则表达式中的下一个模式。在这种特殊情况下,匹配只需要spid="(\d+)"
    【解决方案2】:

    另存为,比如$string

    那就做吧

    $string -match 'spid="(\d+)"'
    

    如果有匹配,你想要的值将在$matches[1]

    【讨论】:

    • 要小心,即使没有匹配项,您仍然可能会从以前的正则表达式匹配中得到 $matches[1] 中的数据。
    猜你喜欢
    • 1970-01-01
    • 2021-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-01-25
    • 2019-03-13
    • 2021-11-09
    • 1970-01-01
    相关资源
    最近更新 更多