正则表达式的帮助很小

时间:2011-09-01 18:02:28

标签: php regex split

我该如何匹配这些:

(1, 'asd', 'asd2')

但不匹配:

(1, '(data)', 0)

我希望匹配(和),但不匹配(和)内部(和)。

实际上这些是查询,我想通过preg_split来分割它们。

/[\(*\)]+/

拆分它们,但也拆分(和)它们内部,我该如何解决这个问题呢?

示例:

数据是:

(1,'user1',1,0,0,0)(2,'user(2)',1,0,0,1)

我想将它们拆分为:

Array(
    0 => (1, 'user1', 1, 0, 0, 0)
    1 => (2, 'user(2)', 1, 0, 0, 1)
);

而不是它,它被拆分为:

Array(
    0 => (1, 'user1', 1, 0, 0, 0)
    1 => (2, 'user
    2 => 2
    3 => ', 1, 0, 0, 1)
);

3 个答案:

答案 0 :(得分:3)

这方面的正则表达式会有点讨厌。相反,您可以遍历整个字符串并决定拆分的位置:

  • 如果是),请在那里拆分。 (我假设括号在字符串中是平衡的,不能嵌套)
  • 如果是',则忽略任何),直至结束'(如果可以转义,则可以查看前面的字符,查看奇数{{1} })。

我认为这是一个比正则表达式更直接的解决方案。

答案 1 :(得分:3)

您不能使用preg_split(因为您不匹配边框,而是更长的模式)。但是有可能使用preg_match_all

 preg_match_all(':\( ((?R) | .)*? \):x', $source, $matches);
 print_r($matches[0]);

除了?R递归版本之外,您还可以为单个内部括号级别准备模式。但实际上这看起来并不简单。

 :\( ( [^()]* | \( [^()]* \) )+ \):x

答案 2 :(得分:2)

你的语法似乎是

list:  '(' num ( ',' term )(s?) ')'
term:  num | str
num:   /[0-9]+/
str:   /'[^']*'/

所以模式是

/ \G \s* \( \s* [0-9]+ (?: \s* , \s* (?: [0-9]+ | '[^']*' ) )* \s* \) /x

嗯,这只是为了匹配。如果PHP像Perl一样工作,那么提取很简单。如果你想使用正则表达式匹配,你需要两次通过。

首先提取清单:

/ \G \s* \( \s* ( [0-9]+ (?: \s* , \s* (?: [0-9]+ | '[^']*' ) )* ) \s* \) /x

然后从列表中提取条款:

/ \G \s* ( [0-9]+ | '[^']*' ) (?: \s* , )? /x