RegEX不在括号中

时间:2018-06-01 06:29:28

标签: php regex string brackets

我需要通过不在括号中的管道来拆分文本。这是示例文本

I {need|want|{ask|prefer}} you to {help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school} 

我找到了/\|(?![^{]*})/g 在这里:regex, extract string NOT between two brackets

现在我想用管道分割这部分字符串

help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school 
它还会选择Jason,Maria,Santa之间的管道,因为它们后面有一个开口括号。如果不在任何括号中,如何更改正则表达式以匹配管道。

测试字符串:

help {Jason|Maria|Santa|{Lucia|Raul}'s father}|go to school

应该返回

help {Jason|Maria|Santa|{Lucia|Raul}'s father}
go to school

Jason|Maria|Santa|{Lucia|Raul}'s father

应该返回

Jason
Maria
Santa
{Lucia|Raul}'s father

1 个答案:

答案 0 :(得分:3)

您可以使用SKIP-FAIL regex

'~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~'

请参阅regex demo

<强>详情

  • (\{(?:[^{}]++|(?1))*})(*SKIP)(*F) - 匹配平衡花括号之间的子字符串并跳过此匹配
    • (\{(?:[^{}]++|(?1))*}) - 捕获与{匹配的第1组,然后递归除了{}以外的0+重复1 +个字符或整个第1组模式({ {1}}是一个正则表达式子例程),然后是(?1)(平衡花括号子串)
    • } - 使正则表达式引擎无法匹配的PCRE动词,并跳过匹配的文本以从匹配结束继续匹配
  • (*SKIP)(*F) - 或
  • | - 匹配要与之分割的文字管道。

PHP demo

\|

输出:

$re = '~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~';
$str = "Jason|Maria|Santa|{Lucia|Raul}'s father";
print_r( preg_split($re, $str) );