Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回多个匹配项,但仅在使用PHP和正则表达式的模式首次出现之前返回_Php_Regex - Fatal编程技术网

返回多个匹配项,但仅在使用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}$
解释

  • ^
    字符串的开头
  • I\([^()]*\){
    Match
    I
    后跟
    (…){
  • (?:
    非捕获组
    • \R(?!}|.*n=Marc)
      匹配unicode换行符序列,断言右边的不是
      }
      或该行包含n=Marc
    • *
      匹配任意字符0+次
  • )*
    关闭非捕获组并重复0多次
  • \R
    匹配unicode换行符序列
  • *\bn=Marc\b.*
    匹配任何字符0+次,并在单词边界之间匹配
    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));