【问题标题】:Regular Expression (Regex) for pulling name between quotations - Powershell用于在引号之间提取名称的正则表达式 (Regex) - Powershell
【发布时间】:2013-08-12 01:31:36
【问题描述】:

我的字符串如下所示:

\\.\ROOT\abc\kjasdkj\MyClass:InstanceName.name="sxs-test3"

我想要一个只能在引号中提取名称的正则表达式,所以结果是sxs-test3

另外,我正在使用 windows Powershell 来做这个,这可以在 PowerShell 中完成吗?

谢谢

【问题讨论】:

  • 你试过了吗?

标签: regex powershell


【解决方案1】:

这是另一个不需要正则表达式的选项:

$path.TrimEnd('"').Split('="',[StringSplitOptions]::RemoveEmptyEntries)[-1]

【讨论】:

  • 这只有在字符串以双引号结尾时才能正常工作。
  • 对我有用,即使名字没有用引号括起来。
  • 在我的测试中,它从foo"bar" 中提取了bar,但从foo"bar"baz 中提取了baz
  • 我正在测试 ...="..." 和 ...=...,在任何情况下都需要等号。
  • 我也喜欢那个。谢谢
【解决方案2】:

对于那个字符串,这个正则表达式对我来说似乎最简单:

$string = '\\.\ROOT\abc\kjasdkj\MyClass:InstanceName.name="sxs-test3"'

if ($string  -match '"(.+?)"') {
    $Matches[1]
}

尽可能少地匹配双引号内的所有内容(惰性扩展)。

【讨论】:

    【解决方案3】:
    if ($subject -cmatch '(?<=")[^"]*(?=")') {
        $result = $matches[0]
    } 
    

    这会查找除引号 ([^"]*) 之外的任意数量的字符,但前提是它们前面有一个引号 ((?&lt;=")),后跟一个引号 ((?="))。

    它甚至不尝试处理转义的引号。

    【讨论】:

    • if ($subject -match '"([^"]*)"') {$result = $matches[1]} 不够吗?
    • 使用这个在线工具,我没有看到你的正则表达式在工作@AnsgarWiechers
    • 我明白了,因为它是匹配列表的第二个元素。那是特定于 powershell 的。谢谢
    猜你喜欢
    • 2012-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 2010-09-15
    相关资源
    最近更新 更多