首页 > 如何使用正则表达式进行无序匹配?

如何使用正则表达式进行无序匹配?

例子如下:
<element abc="123" def="456" ghi="789"/>
有一个如上的字符串,其中abcdefghi的位置有可能并非按照这个顺序排列的(例如<element abc="123" ghi="789" def="456"/>),也有可能缺少部分属性(如<element ghi="789" def="456"/>),请问能否实现无论这几个属性如何排列,都能够将他们的值(指的是123、456、789)提取出来?


Why it's not possible to use regex to parse HTML/XML: a formal explanation in layman's terms: @StackOverflow


楼上的都不是无序匹配 差评


Python

s = '<element def="8972" abc="dsfasdfasfdasf"/>'
re.findall(r'(abc|def|ghi)="(.*?)"', s)

# [('def', '8972'), ('abc', 'dsfasdfasfdasf')]

这里献上一个笨方法:

sed 's/.*abc="\([0-9]*\).*/\1/g' filename
sed 's/.*def="\([0-9]*\).*/\1/g' filename
sed 's/.*ghi="\([0-9]*\).*/\1/g' filename

得到每个属性的值,然后整合起来。


我使用PHP来做吧,说说我的做法, 分3次做, 所以不会有问题:

<?php

$string = '<element abc="123" def="456" ghi="789"/>';

preg_match("/abc=\"(\d+)\"/s", $string, $matches_abc);
preg_match("/def=\"(\d+)\"/s", $string, $matches_def);
preg_match("/ghi=\"(\d+)\"/s", $string, $matches_ghi);

var_dump($matches_abc, $matches_def, $matches_ghi);

?>

这个只能解决问题, 非完美解答。

分割线

请教朋友后得出完美解答,PHP版本:

<?php
$txt = '<element def="123" abc="456" ghi="789"/>';
//$txt = '<element def="456" ghi="789"/>';
//#$txt = '<element/>';
$pattern = '/(?!<element)(?:([a-z\d]+?)=([\'"][^=]+?[\'"]))/';
preg_match_all($pattern, $txt, $matches);
var_dump($matches);
?>
【热门文章】
【热门文章】