尝试使用正则表达式从以下字符串($ 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
为什么第一次尝试不起作用?我真的不想使用第三个和工作示例,因为它依赖于属性的顺序。什么是更好的解决方案?
答案 0 :(得分:0)
第一个不起作用,因为正则表达式中的匹配是贪婪。
这意味着它将尝试尽可能多地从输入中消耗,如果到达输入结束时未达到匹配,它将回溯并尝试另一个匹配,直到它:
第一个和第二个正则表达式几乎相同,尽可能多地消耗输入,匹配最后引号或最后一个引号和空格。
另一方面,第三个需要匹配" v
才能使其发挥作用,并且我猜测你的字符串中它是匹配的最合适的位置。
注意:我同意您应该使用xml解析器的注释,如果您要查找的模式很简单,请考虑使用split而不是regexp
答案 1 :(得分:0)
尝试匹配非引号:
$data -match "status='"[^']*""