2012-11-10 53 views
2

什么样的正则表达式模式可以用于使用圆括号对中的以下点查找单词。匹配包裹的图案

as。 df.kj hlasfa(asd。 las kdfh。)dfs adk jfh。一个(sd.kf)JHD(DSK FH。)dskfdf ASDF DFS lkjh asdfdsfjkhlkjh(ASDF。)作为fadf ASF

期望的结果以粗体显示。

+0

应(sd.kf)也被加粗? – HamZa

+0

@HamZaDzCyber​​DeV不应该 – PHPst

+0

你尝试过那种方法不起作用? – rdlowrey

回答

2

一个多的选择是:

\b[a-zA-Z]+[.](?=[)])(?=[^(]*[)])   
+0

@Reza - 没有向后看。第一个肯定的前瞻'(?= [)])'确保在期间后面有一个空格或者结束圆括号。第二个肯定性前瞻'(?= [^(] * [)])'确保在后面的圆括号之后出现圆形括号,并且在该期间和该圆形括号之间没有开头的圆括号。 –

3

你可以使用一个lookahead,断言有下一个关闭一个之前没有开括号:

preg_match_all('/[a-zA-Z]+\.(?![a-zA-Z])(?=[^()]*\))/', $input, $matches); 

你会发现在四场比赛中$matches

第一个负面预测消除了HamZa在评论中提到的情况。第二个(肯定的)lookahead试图在下一个开场之前找到右括号。

这里有一个警告。一旦你嵌套括号,这将开始崩溃。 some(text. (here))将不匹配text.。嵌套模式(使用括号可能会出现)通常超出正则表达式的范围,尽管某些引擎可以部分处理它们。如果这是你的情况,你最好手动浏览字符串并计算括号。

+0

谢谢,这里不是递归吗? – PHPst

+0

@Reza在PHP递归中,只有检查输入字符串的正确结构才有意义。对于匹配和替换它并不适用,因为每个捕获组只能得到一个结果。所以所需模式的嵌套事件不能一次性检索。 –

+0

再次感谢。我迷茫!你能否再详细解释一下第二个lookahead。 – PHPst