我该如何匹配这些:
(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)
);
答案 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