Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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,我有一些解析器的输出,我想在其中搜索子字符串。输出: (ROOT (S (NP (DT the) (NN author)) (VP (VBZ has) (VP (VBN failed) (S (VP (TO to) (VP (VP (VB catch) (PRT (RP up)) (PP (IN with) (NP (NP (

我有一些解析器的输出,我想在其中搜索子字符串。输出:

(ROOT  
(S
(NP (DT the) (NN author))
(VP (VBZ has)
  (VP (VBN failed)
    (S
      (VP (TO to)
        (VP
          (VP (VB catch)
            (PRT (RP up))
            (PP (IN with)
              (NP
                (NP (JJ recent) (NNS discoveries))
                (PP (IN about)
                  (NP (NNP Thespis))))))
          (PRN (, ,)
            (S
              (NP (NNP Gilbert)
                (CC and)
                (NNP Sullivan))
              (VP (VBZ 's)
                (ADJP (JJ first))))
            (, ,))
          (NP (`` `) (JJ lost) ('' ') (JJ joint) (NN work)))))))
(. .)))
我想匹配这部分:

(PRN (, ,)
        (S
          (NP (NNP Gilbert)
            (CC and)
            (NNP Sullivan))
          (VP (VBZ 's)
            (ADJP (JJ first))))
        (, ,))
在本部分中,PRN必须是静态的。
我将如何为此编写正则表达式?

您是否只是要求一个与上述输出匹配的表达式?如果是的话,这是可行的:

$output = "(ROOT
(S
(NP (DT the) (NN author))
(VP (VBZ has)
  (VP (VBN failed)
    (S
      (VP (TO to)
        (VP
          (VP (VB catch)
            (PRT (RP up))
            (PP (IN with)
              (NP
                (NP (JJ recent) (NNS discoveries))
                (PP (IN about)
                  (NP (NNP Thespis))))))
          (PRN (, ,)
            (S
              (NP (NNP Gilbert)
                (CC and)
                (NNP Sullivan))
              (VP (VBZ 's)
                (ADJP (JJ first))))
            (, ,))
          (NP (`` `) (JJ lost) ('' ') (JJ joint) (NN work)))))))
(. .)))";

preg_match('/\(PRN.*,\)\)/s', $output, $match);
print_r($match[0]);
输出:

php reg.php
(PRN (, ,)
            (S
              (NP (NNP Gilbert)
                (CC and)
                (NNP Sullivan))
              (VP (VBZ 's)
                (ADJP (JJ first))))
            (, ,))

假设您希望匹配一个以
PRN
开头的圆括号组,该组可能包含嵌套的圆括号组(并且整个块本身可能嵌套在封闭的圆括号组中),那么以下经过测试的递归正则表达式解决方案将实现此目的:

递归PCRE正则表达式解决方案:

以下是输出:

Match found:
(PRN (, ,)
            (S
              (NP (NNP Gilbert)
                (CC and)
                (NNP Sullivan))
              (VP (VBZ 's)
                (ADJP (JJ first))))
            (, ,))

请注意,此解决方案要求所有组都有适当的平衡和匹配的开括号和右括号。

PRN是静态文本吗?它不会被改变吗?@没关系,是的。这是静态的,这是什么语法?看起来很奇特。递归需要更多的爱,+1:)