使用正则表达式分割由竖线(|)分隔的字符串,但忽略括号中的竖线

时间:2018-10-22 14:12:46

标签: php regex

假设我在php(laravel)中有一个这样的字符串:

make|aaa|select.aaa|ttt|actived_by(creator.url|test|ali)

现在我想将其转换为这样的数组:

make
aaa
select.aaa
tttt
actived_by(creator.url|test|ali)

您只能看到用于分隔的括号中未包括的管道标志。

为此,我编写了如下函数:

function parseQuery($query) {
    preg_match_all("/[^\|]+/", $query, $match);
    return $match;
}

但是它的输出如下:

make
aaa
select.aaa
ttt
actived_by(creator.url
test
ali)

要使用什么正则表达式才能达到预期效果?

2 个答案:

答案 0 :(得分:2)

您可以改用以下正则表达式:

(?=[^|])(?:[^|]*\([^)]+\))*[^|]*

演示:https://regex101.com/r/CONoJ2/2

答案 1 :(得分:2)

使用正则表达式使用preg_match_all可能也很有意义:

/[^|(]+(\([^)]+\))?/

这将捕获不带括号或不带有管道[^(]+的字符串,并可选地跟随由括号(\([^)]+\))?封装的段

正则表达式在javascript中进行了演示

var input = "make|aaa|select.aaa|ttt|actived_by(creator.url|test|ali)"

console.log(input.match(/[^|(]+(\([^)]+\))?/g))