【问题标题】:How to get the text between any number of parenthesis?如何获取任意数量的括号之间的文本?
【发布时间】:2017-08-28 06:16:20
【问题描述】:

假设我有一个文档,我想在其中捕获前后有括号的字符串。

示例:This [is] a {{test}} sentence. The (((end))).

所以基本上我想得到istestend这三个词。

提前致谢。

【问题讨论】:

  • 也可以使用[\[\{\(]+(\w+)[\]\}\)]+
  • 你需要这样的东西:(?:\[+|\(+|\{+)([a-zA-Z]+)(?:\]+|\)+|\}+) 见例子:regex101.com/r/2fPHIK/1
  • 需要澄清:1. 右括号是否必须与左括号匹配? 2.“捕获之前或之后有括号的字符串。”这是否意味着“end)”应该导致匹配“end”?
  • 预期结果是什么:(This is) {[a)} [[t)e{s}t].]

标签: php regex string parsing


【解决方案1】:

根据您的条件“之后有括号的字符串” - 任何单词都可以以 OR 开头,后跟某种类型的括号:

$text = 'This [is] a {{test}} sentence. The (((end))). Some word))';
preg_match_all('/(?:\[+|\{+|\(+)(\w+)|(\w+)(?:\]+|\}+|\)+)/', $text, $m);
$result = array_filter(array_merge($m[1],$m[2]));

print_r($result);

输出:

Array
(
    [0] => is
    [1] => test
    [2] => end
    [7] => word
)

【讨论】:

  • 问题是:结束符号应该与开始符号匹配吗?如何处理'{{test)}'?是匹配“测试”还是“测试)”?您的正则表达式给出“测试”作为结果,即 - 不要误会我的意思 - 本身并没有错。 OP不清楚。
  • @mlambichs。再次阅读问题之前有括号的字符串之后的描述
【解决方案2】:

下面的代码对我有用。

<?php

$in = "This [is] a {{test}} sentence. The (((end))).";
preg_match_all('/(?<=\(|\[|{)[^()\[\]{}]+/', $in, $out);
echo $out[0][0]."<br>".$out[0][1]."<br>".$out[0][2];
?>

【讨论】:

    【解决方案3】:

    您的正则表达式可能是:

    [\[{(]((?(?<=\[)[^\[\]]+|(?(?<={)[^{}]+|[^()]+)))
    

    说明:需要 if-then-else 构造来确保开头的 '{' 与结尾的 '}' 匹配,等等。

    [\[{(]                                   # Read [, { or (
    ((?(?<=\[)                               # Lookbehind: IF preceding char is [
     [^\[\]]+                                # THEN read all chars unequal to [ and ]
     |                                       # ELSE
     (?(?<={)                                # IF preceding char is {
     [^{}]+                                  # THEN read all chars unequal to { and }
     |                                       # ELSE
     [^()]+)))                               # read all chars unequal to ( and )
    

    regex101.com

    【讨论】:

      【解决方案4】:

      试试这个正则表达式:

      (?<=\(|\[|{)[^()\[\]{}]+
      

      >>>Demo<<<

      或者这个:

      (?<=\(|{|\[)(?!\(|{|\[)[^)\]}]+
      

      >>>Demo<<<

      解释(对于第一个正则表达式):

      • (?&lt;=\(|\[|{) - 正向后视 - 查找前面有 {[( 的零长度匹配
      • [^()\[\]{}]+ - 出现一个或多个不属于以下字符的任何字符:[({})]

      解释(第二个正则表达式):

      • (?&lt;=\(|\[|{) - 正向后视 - 查找前面有 {[( 的零长度匹配

      • (?!\(|{|\[) - 负前瞻 - 在上一步中,它找到了刚刚开始括号前面的位置。这段正则表达式验证它后面没有另一个左括号。因此,匹配最里面的左括号之后的位置 - ({[

      • [^)\]}]+ - 出现一次或多次不在这些右括号内的字符 - ]})

      【讨论】:

      • 这里相同:问题是:结束符号是否应该与开始符号匹配?如何处理'{{test)}'?是匹配“测试”还是“测试)”?您的正则表达式给出“测试”作为结果,即 - 不要误会我的意思 - 本身并没有错。 OP不清楚。
      • @mlambichs 检查我的第二个正则表达式。它也涵盖了这种情况。
      • 不,它没有。它清楚地匹配 '([[({{ofs)}}}}}))))' 中的 'ofs'。问题是这是否正确,或者匹配是否应该是 'ofs )'。
      • 是的。那需要澄清一下。问题不清楚/不完整。
      猜你喜欢
      • 1970-01-01
      • 2010-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多