正则表达式匹配管道分隔字符串与管道转义
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 回顾确保 |
不在 \
之后。
这应该也有效:
((?:[^\|]+|\\|?)+)
正则表达式将捕获所有内容,直到单个 |
(包括 \|
)
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"]
我想获取管道分隔字符串的单个字符串,支持 "pipe escaping",例如:
fielda|field b |field\|with\|pipe\|inside
会得到我:
array("fielda", "field b ", "field|with|pipe|inside")
我如何使用正则表达式实现该目标?
Split by this (?<!\)\|
查看 demo.The 回顾确保 |
不在 \
之后。
这应该也有效:
((?:[^\|]+|\\|?)+)
正则表达式将捕获所有内容,直到单个 |
(包括 \|
)
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"]