如何在任意数量的括号之间获取文本?

时间:2017-08-28 06:16:21

标签: php regex string parsing

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

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

基本上我希望得到istestend这两个字。

提前致谢。

4 个答案:

答案 0 :(得分:1)

你的正则表达式可能是:

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

说明:需要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

答案 1 :(得分:1)

试试这个正则表达式:

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

>>>Demo<<<

或者这个:

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

>>>Demo<<<

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

  • (?<=\(|\[|{) - 正面观察 - 在{[(
  • 之前寻找零长度匹配
  • [^()\[\]{}]+ - 不属于以下字符的任何字符的一个或多个出现:[({},{{ 1}},)

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

  • ] - 正面观察 - 在(?<=\(|\[|{){[

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

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

答案 2 :(得分:1)

根据您的情况&#34; 字符串在之后具有括号&#34; - 任何单词都可以用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
)

答案 3 :(得分:1)

以下代码适用于我。

<?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];
?>