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

regular expression to match pipe separated strings with pipe escaping

我想获取管道分隔字符串的单个字符串,支持 "pipe escaping",例如:

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

会得到我:

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

我如何使用正则表达式实现该目标?

Split  by this (?<!\)\|

查看 demo.The 回顾确保 | 不在 \ 之后。

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

这应该也有效:

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

正则表达式将捕获所有内容,直到单个 |(包括 \|

DEMO

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));

您可以将这些项目

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

参见regex demo

注意:如果您需要在 字符而不是 | 上拆分,只需将其替换为第一个 negated character class[^\|]。请注意,您必须转义 ](除非它紧跟在 [^ 之后)和 -(如果不在 class 的 start/end 处) .

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

参见 regex graph:

JS 演示:

console.log(
   "fielda|field b |field\|with\|pipe\|inside".match(/(?:[^\|]|\[\s\S])+/g)
)
// =>  ["fielda", "field b ", "field\|with\|pipe\|inside"]