关于正则表达式的一点帮助


Little help with regex

如何匹配:

(1, 'asd', 'asd2')

但不匹配:

(1, '(data)', 0)

我想匹配(and),但不匹配(and)里面的(and)。

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

/['(*')]+/

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

的例子:

数据为:

(1, user1, 1, 0, 0, 0)(2,用户(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)
);

这样的正则表达式有点麻烦。相反,您可以遍历整个字符串并决定在哪里分割:

  • 如果是),在那里分割。(我假设括号在字符串中是平衡的,不能嵌套)
  • 如果是',忽略任何),直到关闭'(如果可以转义,您可以查看前面的字符以查找奇数')。

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

你不能使用preg_split(因为你不匹配边界,但更长的模式)。但preg_match_all:

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

除了?R递归版本,您还可以只准备一层内部括号的模式。但这看起来并不简单。

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

你的语法似乎是

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

模式是

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

这只是为了匹配。如果PHP像Perl一样工作,提取就会变得更复杂。如果你想用regex匹配,你必须分两次来做。

首先提取列表:

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

然后从列表中提取术语:

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