如何在严格的订单中匹配随机订单中的数据?

时间:2014-07-18 01:05:24

标签: regex pcre

我对正则表达式很新,我有以下目标字符串资源,有时可能略有不同。例如,字符串可能是:

<TITLE>SomeTitle</TITLE>
<ITEM1>Item 1 text</ITEM>
<ITEM2>Item 2 text</ITEM2>
<ITEM3>Item 3 text</ITEM3>

下次请求资源时,它的输出可能是:

<ITEM1>Item 1 text</ITEM>
<ITEM2>Item 2 text</ITEM2>
<ITEM3>Item 3 text</ITEM3>
<TITLE>SomeTitle</TITLE>

我希望按照第一个示例的顺序捕获两个标记之间的数据,以便匹配始终匹配&#34; SomeTitle&#34;首先,然后是项目。因此,如果搜索字符串是第二个示例,我需要一个可以首先匹配的表达式&#34; SomeTitle&#34;然后以某种方式&#34;重置&#34;比赛的位置从头开始,所以我可以匹配项目。

我可以通过两种不同的模式搜索来实现这一点,但是想知道是否有办法在单个搜索模式中执行此操作?也许使用前瞻/外观和条件?

1 个答案:

答案 0 :(得分:1)

在Lookaheads中捕获组

使用此:

(?s)(?=.*<TITLE>(.*?)</)(?=.*<ITEM1>(.*?)</)(?=.*<ITEM2>(.*?)</)(?=.*<ITEM3>(.*?)</)

即使令牌是随机顺序,您也可以通过检查捕获组1,2,3和4以正确的顺序查看它们。

例如,在online regex demo中,查看输入是按随机顺序排列的,但右侧窗格中的捕获组顺序正确。

PCRE:如何在编程语言中使用

PCRE库用于几种编程语言:例如PHP,R,Delphi和C语言。无论语言如何,这个想法都是一样的:检索捕获组。

例如,以下是如何在PHP中执行此操作:

$regex = '~(?s)(?=.*<TITLE>(.*?)</)(?=.*<ITEM1>(.*?)</)(?=.*<ITEM2>(.*?)</)(?=.*<ITEM3>(.*?)</)~';
if (preg_match($regex, $yourdata, $m)) {
    $title = $m[1];
    $item1 = $m[2];
    $item2 = $m[3];
    $item3 = $m[4];
    } 
else { // sorry, no match...
     }