很抱歉标题不好,但这是一个非常笼统的问题
我必须匹配这个模式
;AAAAAAA(BBBBBB,CCCCC,DDDDDD)
- AAAAA = 所有以“;”开头的字符到“(”(两者;(不包括在内)
- BBBBB = 从“(”到“,”开始的所有字符(均为 (,不包括在内)
- CCCCC = 从“,”到“,”的所有字符(不包括 ,, )
- DDDDD = 从“,”到“)”(不包括 ,) 的所有字符)
“x 和 y 之间的所有字符”是一个每次都让我丧命的问题
:(
我正在使用 PHP,我必须匹配所有出现的这种模式 (preg_match_all),不幸的是,它也可以在多行上出现
提前致谢!
最佳答案
我建议您不要使用不贪婪的量词,而是让所有重复与其分隔符互斥。这是什么意思?这意味着,例如,A
可以是除 (
之外的任何字符。给这个正则表达式:
;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]
最后一个 [)]
甚至不是必需的。
PHP 代码将如下所示:
preg_match_all('/;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]/', $input, $matches);
$fullMatches = $matches[0];
$arrayOfAs = $matches[1];
$arrayOfBs = $matches[2];
$arrayOfCs = $matches[3];
$arrayOfDs = $matches[4];
如评论所示,我的转义技术是个人喜好问题。这个正则表达式当然等于:
;([^(]*)\(([^,]*),([^,]*),([^)]*)\)
但我认为这看起来比其他变体更加不匹配/不平衡。任你挑!
最后,关于为什么这种方法比使用不贪婪(惰性)量词更好的问题。 Here is some good, general reading.基本上,当您使用不贪婪的量词时,引擎仍然需要回溯。它首先尝试一个重复,然后注意到 (
之后不匹配。所以它必须返回重复并消耗另一个字符。但是 (
仍然不匹配,所以再次回到重复。然而,使用这种方法,引擎将在第一次进入重复时尽可能多地消耗。并且当所有非 (
字符被消耗,那么引擎将能够立即匹配以下 (
。
关于php - 我怎么写这个正则表达式?贪婪相关,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13520561/