使用正则表达式提取字符串时出现结尾问题



尝试使用regex从下面的字符串($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

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

尝试匹配非引号:

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

第一个不起作用,因为regexp中的匹配是贪婪的。

这意味着它将尝试从输入中消耗尽可能多的数据,如果在到达输入结束时没有达到匹配,它将返回跟踪并尝试另一个匹配,直到它:

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

第一个和第二个regexp的作用基本相同,尽可能多地占用输入,匹配最后一个引号或最后一个引号和空格。

另一方面,第三个需要匹配" v才能工作,我猜在您的字符串中,这是它匹配的最正确的地方。

注意:我同意你应该使用xml解析器的评论,如果你想要的模式很简单,可以考虑使用split而不是regexp

最新更新