正则表达式,用管道转义匹配管道分隔的字符串

时间:2015-01-28 19:35:29

标签: regex split

我希望获得一个以管道分隔的字符串的单个字符串,并使用"管道转义"支持,例如:

fielda|field b |field\|with\|pipe\|inside

会得到我:

array("fielda", "field b ", "field|with|pipe|inside")

我如何用正则表达式达到目标?

4 个答案:

答案 0 :(得分:4)

Split  by this (?<!\\)\|

请参阅演示。外观确保|不在\之后。

https://regex101.com/r/pM9yO9/15

答案 1 :(得分:1)

这也应该有效:

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

正则表达式会将所有内容捕获到一个|(包括\|

DEMO

答案 2 :(得分:0)

另一种使用php的方法,使用strtr\|替换为占位符:

$str = 'field a|field b|field\|with\|pipe\|inside';
$str = strtr($str, array('\|' => '#'));
$result = array_map(function ($i) {
    return strtr($i, '#', '|');
}, explode('|', $str));

答案 3 :(得分:0)

您可以匹配这些项目

(?:[^\\|]|\\[\s\S])+

请参见regex demo

注意:如果您需要除| 以外的其他字符,只需将其替换为第一个negated character class,{{1} }。只需注意,您将必须转义[^\\|](除非它放在]之后)和[^(如果不在课程开始/结束时)。

在许多引擎中,-可以用[\s\S]代替,并传递适当的选项to make it match across line endings

请参见regex graph

enter image description here

JS演示:

.