如何匹配:
(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