php - 我怎么写这个正则表达式?贪婪相关

标签 php regex pcre

很抱歉标题不好,但这是一个非常笼统的问题

我必须匹配这个模式

;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/

相关文章:

php - 如何按降序对 id 和 sub_id 进行排序?

php - 使用 javascript 分割面板

php - WooCommerce:按产品类别划分的自定义购物车项目计数

Ruby 正则表达式匹配关键字之间的所有内容

php - 正则表达式反向引用

PHP 正则表达式 (PCRE) - 查找一组所有子字符串

php - 在套接字连接中添加客户端证书

regex - perl 正则表达式匹配失败

python - 如何在pymongo中正确设计正则表达式?

regex - Node JS PCRE 正则表达式和转换支持