我想单独使用正则表达式解决以下问题:一个多行字符串,其中信息一端用 Z!
分隔,另一端用 S0634
分隔,比如:
Z! EXT .000 ...HOUSE... L24JN7
PERSONAL COMPUTER\J\039060-L24JN7-000-*****-*****-
Payroll No.: 1
-Name:
-Folios:
-Date: 6/24/2014
-Subformat: S0634
Z! EXT .000 ...HOUSE... L24JN7
PERSONAL COMPUTER\J\039060-L24JN7-000-*****-*****-
Payroll No.: 2
-Name:
-Date: 6/24/2014
-Subformat: S0634
Z! EXT .000 ...HOUSE... L24JN7
PERSONAL COMPUTER\J\039060-L24JN7-000-*****-*****-
Payroll No.: 3
-Name:
-Folios:
-Date: 6/24/2014
-Subformat: S0634
desired content.</li>
我只想捕获由提到的双字符序列界定并包含单词 Folios
的组(中间的一组没有它,只有 2 组有)。
我知道如何分成组,也可以返回没有的组(例如 (Z!\s*EXT(?:(?!-Folios:) .)*?S0634)
).然而,如何捕捉确实拥有它的群体让我不知所措。我只对正则表达式单行代码解决方案感兴趣(我知道我可以拆成组然后检查每个组)。
最佳答案
使用这个:
$regex = '~(?sm)Z!(?:(?!S0634).)*?Folios.*?S0634~';
preg_match_all($regex, $yourstring, $matches);
// See all matches
print_r($matches[0]);
在the demo , 你可以看到中间组被排除在外。
输出:
Array
(
[0] => Z! EXT .000 ...HOUSE... L24JN7
PERSONAL COMPUTER\J9060-L24JN7-000-*****-*****-
Payroll No.: 1
-Name:
-Folios:
-Date: 6/24/2014
-Subformat: S0634
[1] => Z! EXT .000 ...HOUSE... L24JN7
PERSONAL COMPUTER\J9060-L24JN7-000-*****-*****-
Payroll No.: 3
-Name:
-Folios:
-Date: 6/24/2014
-Subformat: S0634
)
解释
(?s)
激活DOTALL
模式,允许点跨行匹配(?m)
打开多行模式,允许^
和$
在每一行上匹配Z!
匹配起始分隔符(?:(?!S0634).)*?
延迟匹配任何未跟随S0634
的字符,直到...作品集
.*?S0634
延迟匹配字符串的其余部分,直到结束定界符
引用
关于regex - 捕获由单词绑定(bind)且包含特定单词的组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24564947/