我有一个像aa | bb | "cc | dd" | 'ee | ff'
这样的字符串,我正在寻找一种方法来分割它,以获得由|
字符分隔的所有值,其中|
包含在字符串中。
我们的想法是得到像这样的[a, b, "cc | dd", 'ee | ff']
我已经找到了一个类似问题的答案:https://stackoverflow.com/a/11457952/11260467
然而,我找不到一种方法来适应多个分隔符的情况,这里有没有人比我更笨,当谈到正则表达式?
我有一个像aa | bb | "cc | dd" | 'ee | ff'
这样的字符串,我正在寻找一种方法来分割它,以获得由|
字符分隔的所有值,其中|
包含在字符串中。
我们的想法是得到像这样的[a, b, "cc | dd", 'ee | ff']
我已经找到了一个类似问题的答案:https://stackoverflow.com/a/11457952/11260467
然而,我找不到一种方法来适应多个分隔符的情况,这里有没有人比我更笨,当谈到正则表达式?
4条答案
按热度按时间hujrc8aj1#
这可以通过
pcre
提供的(*SKIP)(*FAIL)
功能轻松实现:在
PHP
中,这可能是:并且会屈服于
参见a demo on regex101.com和on ideone.com。
qqrboqgw2#
如果您匹配零件(而不是拆分),这会更容易。模式默认是贪婪的,它们会消耗尽可能多的字符。这允许在为未加引号的标记提供模式之前为加引号的字符串定义更复杂的模式:
输出量:
提示:
<<<'PATTERN'
被称为HEREDOC语法,减少了转义1.我使用
()
作为模式分隔符-它们是组01.匹配使代码更具可读性
1.修饰符
x
允许对模式进行标记和注解c86crjj03#
使用
请参见PHP proof。
结果:
说明
23c0lvtd4#
有趣的是,有很多方法可以构造这个问题的正则表达式。这是另一个类似于@Jan的答案。
PCRE Demo
请注意,管道字符(“or”)之前的部分仅用于将引擎的内部字符串指针移动到刚过右引号或带引号的子字符串。