2017-08-28 145 views
0

假设我有一个文档,我想要捕获之前或之后有括号的字符串。如何获取任意数目的括号之间的文本?

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

所以基本上我想要得到的话istestend

在此先感谢。

+0

您也可以使用'[\ [\ {\(] +(\ w +)\] \} \)] +' – Mohammad

+0

你需要的东西是这样的:'(?:\ [+ | \ (+ | \ {+)([a-zA-Z] +)(?:\] + | \)+ | \} +)' 请参阅示例:https://regex101.com/r/2fPHIK/1/ – Viktor

+1

澄清需要:1.是否必须匹配开头的括号? 2.“捕获在OR之前有括号的字符串”。这是否意味着“结束”)应该导致匹配“结束”? –

回答

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 
) 
+0

问题是:应该关闭符号匹配开头的吗?如何处理“{{test}}”?是匹配'测试'还是'测试')?你的正则表达式给出'测试'的结果,这是 - 不要误解我 - 没有错。 OP不清楚。 –

+0

@mlambrichs。再次阅读来自问题的描述*在**之前有括号的字符串**在**之后* – RomanPerekhrest

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

试试这个正则表达式:

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

>>>Demo<<<

或这一个:

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

>>>Demo<<<

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

  • (?<=\(|\[|{) - 正回顾后 - 寻找一个零长度匹配刚好在前面b雅{[(
  • [^()\[\]{}]+ - 未amoong以下任何字符的一个或多个出现次数:[({})]

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

  • (?<=\(|\[|{) - 正回顾后 - 查找只是由{[(

  • (?!\(|{|\[) preceeded零长度匹配 - 负先行 - 在先前的步骤中,发现这是刚刚由开口托架前面的位置。这块正则表达式验证它没有跟着另一个开头括号。因此,匹配刚刚位于最里面的开放括号之后的位置 - ({[

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

+0

同样在这里:问题是:关闭符号是否与开始符号匹配?如何处理“{{test}}”?是匹配'测试'还是'测试')?你的正则表达式给出'测试'的结果,这是 - 不要误解我 - 没有错。 OP不清楚。 –

+0

@mlambrichs检查我的第二个正则表达式。它也涵盖了这种情况。 – Gurman

+0

不,它不。它明显地匹配'([[({{ofs)}}}}})))''中的'ofs'。问题是如果这是正确的,或者如果比赛应该是'')'。 –

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]; 
?> 
相关问题