返回多个匹配项,但仅在使用PHP和正则表达式的模式首次出现之前返回
我有一个数据集,看起来像返回多个匹配项,但仅在使用PHP和正则表达式的模式首次出现之前返回,php,regex,Php,Regex,我有一个数据集,看起来像 I(0,123...789){ A(0,567...999){.......n=Marc.....} B(2,655...265){..................} C(3,993...333){..................} M(8,635...254){.................;} } O(0,345...789){ A(0,567...999){.......n=Marc.....} B(2,876...775){.............
I(0,123...789){
A(0,567...999){.......n=Marc.....}
B(2,655...265){..................}
C(3,993...333){..................}
M(8,635...254){.................;}
}
O(0,345...789){
A(0,567...999){.......n=Marc.....}
B(2,876...775){..................}
C(3,993...549){..................}
M(8,354...987){.................;}
}
I(0,987...764){
A(0,567...999){.......n=Marc.....}
B(2,543...265){..................}
C(7,998...933){..................}
M(8,645...284){.................;}
}
B(0,123...789){
.......
}
I(0,987...764){
A(0,567...999){.......n=John.....}
B(2,543...265){..................}
C(7,998...933){..................}
M(8,645...284){.................;}
}
我试图返回所有I“sections”,从“I”开始,直到;}后面的结束标记但前提是“I”部分包含n=Marc
到目前为止,我是和你一起来的
^([I]\(.*\){.*n=Marc.*^[M]\(.*;}.)}
但是在某些情况下,当数据具有如下模式时
I(0,123...789){
A(0,567...999){.......n=Marc.....}
B(2,655...265){..................}
C(3,993...333){..................}
M(8,635...254){.................;}
}
O(0,345...789){
A(0,567...999){.......n=Marc.....}
B(2,876...775){..................}
C(3,993...549){..................}
M(8,354...987){.................;}
}
正则表达式返回I和O部分。有没有办法确保它总是返回I部分
- 抱歉,数据集太大,包含大量敏感数据,我无法公开。*
O
部分,该部分包含n=Marc
,类似于:
(?=O\()([\s\S]*?n=Marc[\s\S]*?;}\s*})
或者可能:
(?=O\()([\s\S]*?n=Marc[\s\S]*?;})\s*}
对于I
部分,我们只需将O
更改为I
:
(?=I\()([\s\S]*?n=Marc[\s\S]*?;})\s*}
试验
输出
一个选项可能是匹配
I
,然后匹配所有不以}
开头的行,并至少匹配一行包含n=Marc
^I\([^()]*\){(?:\R(?!}|.*n=Marc).*)*\R.*\bn=Marc\b.*(?:\R(?!}).*)*\R}$
解释
字符串的开头^
MatchI\([^()]*\){
后跟I
(…){
非捕获组(?:
匹配unicode换行符序列,断言右边的不是\R(?!}|.*n=Marc)
或该行包含n=Marc}
匹配任意字符0+次*
关闭非捕获组并重复0多次)*
匹配unicode换行符序列\R
匹配任何字符0+次,并在单词边界之间匹配*\bn=Marc\b.*
n=Marc
非捕获组(?:
匹配新行序列,断言右侧的内容不是\R(?!}.*
}
关闭非捕获组并重复0多次)*
匹配换行符序列\R
匹配结束}
}
字符串结尾$
如果我知道,输入的格式总是像sample一样,宁愿在行首的结尾处拆分成块,如果后面跟一个上限,则后面跟一个换行: 然后使用查找以
I
开头并包含n=Marc
的项目
在您的模式中,*
可以跳过不需要的项,从而导致意外的匹配
I(0,123...789){
A(0,567...999){.......n=Marc.....}
B(2,655...265){..................}
C(3,993...333){..................}
M(8,635...254){.................;}
}
I(0,987...764){
A(0,567...999){.......n=Marc.....}
B(2,543...265){..................}
C(7,998...933){..................}
M(8,645...284){.................;}
}
^I\([^()]*\){(?:\R(?!}|.*n=Marc).*)*\R.*\bn=Marc\b.*(?:\R(?!}).*)*\R}$
$res = preg_grep('/^I.*n=Marc/s', preg_split('/^}\R(?=[A-Z])/m', $str));