regex - 捕获由单词绑定(bind)且包含特定单词的组

标签 regex pcre autoit regex-lookarounds

我想单独使用正则表达式解决以下问题:一个多行字符串,其中信息一端用 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/

相关文章:

javascript - 在评论中链接用户

用于评估日期范围的正则表达式

c - C 中的模式匹配,PCR 的替代方案

updates - 自动添加一行文本到编辑框

javascript - 可能的类似 Autoit 的 JavaScript 宏?

javascript - 仅当子模式不匹配时才匹配正则表达式

php - 如何防止使用 Regex 删除斜杠?

regex - 删除第一级 block

c++ - 为什么 PCRE 静态库在 Win 和 Linux 上大小不同

java - 如何使用 AutoIT 单击 java swing 控件?