使用正则表达式问题提取字符串并结束

时间:2015-07-02 08:44:54

标签: regex powershell

尝试使用正则表达式从以下字符串($ data)中提取状态值。麻烦在于指定值的结束。

$data = "<?xml version="1.0" encoding="UTF-8"?><bi:Element xml:bi="http://www.bi.com/1.0.0" status="www.google.com/path/file.ext" version="2.0" xml:pa="http://www.pa.com/1.1.1" ...>

// Attempt #1
$data -match "status='"(.*)'""
// $matches[1] contains www.google.com/path/file.ext" version="2.0" xml:pa="http://www.pa.com/1.1.1" ...>

// Attempt #2
$data -match "status='"(.*)'" "
// $matches[1] contains www.google.com/path/file.ext" version="2.0" xml:pa="http://www.pa.com/1.1.1" ...>

// Attempt #3
$data -match "status='"(.*)'" v"
// $matches[1] contains www.google.com/path/file.ext

为什么第一次尝试不起作用?我真的不想使用第三个和工作示例,因为它依赖于属性的顺序。什么是更好的解决方案?

2 个答案:

答案 0 :(得分:0)

第一个不起作用,因为正则表达式中的匹配是贪婪

这意味着它将尝试尽可能多地从输入中消耗,如果到达输入结束时未达到匹配,它将回溯并尝试另一个匹配,直到它:

  • 找到匹配或
  • 在尝试匹配开始时回溯(这不一定是输入的开头),然后失败。

第一个和第二个正则表达式几乎相同,尽可能多地消耗输入,匹配最后引号或最后一个引号和空格。

另一方面,第三个需要匹配" v才能使其发挥作用,并且我猜测你的字符串中它是匹配的最合适的位置。

注意:我同意您应该使用xml解析器的注释,如果您要查找的模式很简单,请考虑使用split而不是regexp

答案 1 :(得分:0)

尝试匹配非引号:

$data -match "status='"[^']*""