我需要通过不在括号中的管道来拆分文本。这是示例文本
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
答案 0 :(得分:3)
您可以使用SKIP-FAIL regex:
'~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~'
请参阅regex demo
<强>详情
(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)
- 匹配平衡花括号之间的子字符串并跳过此匹配
(\{(?:[^{}]++|(?1))*})
- 捕获与{
匹配的第1组,然后递归除了{
和}
以外的0+重复1 +个字符或整个第1组模式({ {1}}是一个正则表达式子例程),然后是(?1)
(平衡花括号子串)}
- 使正则表达式引擎无法匹配的PCRE动词,并跳过匹配的文本以从匹配结束继续匹配(*SKIP)(*F)
- 或|
- 匹配要与之分割的文字管道。\|
输出:
$re = '~(\{(?:[^{}]++|(?1))*})(*SKIP)(*F)|\|~';
$str = "Jason|Maria|Santa|{Lucia|Raul}'s father";
print_r( preg_split($re, $str) );