【问题标题】:how can i write this regex? ungreedy related我怎么写这个正则表达式?贪心相关
【发布时间】:2012-11-11 07:34:29
【问题描述】:

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

我必须匹配这个模式

;AAAAAAA(BBBBBB,CCCCC,DDDDDD)
  • AAAAA = 所有以“;”开头的字符到“(”(两者;(不包括)
  • BBBBB = 从 "(" 到 "," 开始的所有字符(两者都是(,不包括在内)
  • CCCCC = 从 "," 到 "," 的所有字符(都 , 不包括在内)
  • DDDDD = 从 "," 到 ")" 开始的所有字符(不包括 ,))

“x 和 y 之间的所有字符”是一个让我每次都想死的问题

:(

我正在使用 PHP,我必须匹配所有出现的这种模式 (preg_match_all),遗憾的是,它也可以在多行上

提前谢谢你!

【问题讨论】:

  • 所以括号内总是只有 3 个元素?
  • 它与贪婪有什么关系?
  • 你试过什么正则表达式?是匹配太多还是太少? * 另请参阅 Open source RegexBuddy alternativesOnline regex testing 了解一些有用的工具,或参阅 RegExp.info 了解更好的教程。
  • @zerkms 是,如果有多次出现,B 无论如何都是。
  • @zerkms 不是使用否定集。但使用否定集来避免贪婪。后者似乎是首选推荐,而使用否定字符类在正则表达式的新手中似乎非常陌生。

标签: php regex pcre


【解决方案1】:

我建议您不要使用不贪婪的量词,而是使所有重复与其分隔符互斥。这是什么意思?例如,这意味着A 可以是除( 之外的任何字符。给出这个正则表达式:

;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]

最后一个[)] 甚至都不需要。

PHP 代码将如下所示:

preg_match_all('/;([^(]*)[(]([^,]*),([^,]*),([^)]*)[)]/', $input, $matches);
$fullMatches = $matches[0];
$arrayOfAs = $matches[1];
$arrayOfBs = $matches[2];
$arrayOfCs = $matches[3];
$arrayOfDs = $matches[4];

正如 cmets 所展示的,我的逃跑技巧是一种品味问题。这个正则表达式当然等于:

;([^(]*)\(([^,]*),([^,]*),([^)]*)\)

但我认为这看起来比其他变体更不匹配/不平衡。任你挑!

最后,关于为什么这种方法比使用不贪婪(惰性)量词更好的问题。 Here is some good, general reading. 基本上,当你使用不贪婪的量词时,引擎仍然需要回溯。它首先尝试一次重复,然后注意到之后的 ( 不匹配。所以它必须回到重复并消耗另一个角色。但是( 仍然不匹配,所以再次回到重复。但是,使用这种方法,引擎将在第一次进入重复时尽可能多地消耗。而当所有非(的字符都被消耗完后,引擎就能马上匹配到下面的(

【讨论】:

  • [(], [)] --- 你为什么要创建一个角色的集合?
  • [(]\( 更令人困惑。
  • @zerkms 转义。秋葵汤,我想这是一个口味问题
  • @m.buettner 那么你会用什么来匹配文字[]?只是\[] 或者更确切地说是[[][]]
  • @Gumbo 我通常会避开这些,因为这些 在短字符类中更加令人困惑。但是[(] 制作了一个漂亮的、独立的正方形(在视觉上),它很容易在正则表达式中被识别为一个单一的东西。而\( 仍然离开some odd tension with me。此外,字符类转义比反斜杠更突出。如果您有 [.][+] 之类的内容,则相关字符仍位于其占据的空间的中心。我发现 `` 在所有情况下,除了字面方括号之外,都更加混乱,真的。
【解决方案2】:

你可以使用类似这样的代码:

preg_match_all('/;(.*?)\((.*?),(.*?),(.*?)\)/s',$text,$matches);

ideone.com 上查看。

基本上,您可以使用.*?(问号不贪心),确保转义括号,并且您可能需要s 修饰符使其在多行上工作。

变量将在一个数组中:$matches

【讨论】:

    猜你喜欢
    • 2012-04-27
    • 1970-01-01
    • 2014-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-29
    • 2016-02-29
    相关资源
    最近更新 更多