我对正则表达式很新,我有以下目标字符串资源,有时可能略有不同。例如,字符串可能是:
<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;比赛的位置从头开始,所以我可以匹配项目。
我可以通过两种不同的模式搜索来实现这一点,但是想知道是否有办法在单个搜索模式中执行此操作?也许使用前瞻/外观和条件?
答案 0 :(得分:1)
使用此:
(?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...
}