代码之家  ›  专栏  ›  技术社区  ›  Stewie

忽略可选逗号的正则表达式

  •  2
  • Stewie  · 技术社区  · 14 年前

    我有一篇课文:

    $test = <<<START
     DOTHIS themsp1
      @theint =    431,
      @theText = "%dumdum%",
      @operator = 'ANY',
      @crossCheck = 'PLUS'
    
    
    START;
    

    过滤器:

    $regEx = '/@(.*)=(.*)[,]*?/';
    preg_match_all($regEx,$test,$vars,PREG_SET_ORDER);
    print_r($vars);
    

    输出:

    Array
    (
        [0] => Array
            (
                [0] => @theint =  431,
                [1] => theint 
                [2] =>   431,
            )
    
        [1] => Array
            (
                [0] => @theText = "%dumdum%",
                [1] => theText 
                [2] =>  "%dumdum%",
            )
    
        [2] => Array
            (
                [0] => @operator = 'ANY',
                [1] => operator 
                [2] =>  'ANY',
            )
    
        [3] => Array
            (
                [0] => @crossCheck = 'PLUS'
                [1] => crossCheck 
                [2] =>  'PLUS'
            )
    
    )
    

    我不想在输出中使用逗号或空格:(..问题是逗号是可选的;

    3 回复  |  直到 14 年前
        1
  •  2
  •   Stephen P    14 年前

    在你的正则表达式中 $regEx = '/@(.*)=(.*)[,]*?/'; 第二个(.*)太贪婪了,将与逗号匹配,因为您编写的逗号是可选的。

    未经测试,此regex将允许等号周围的可选空格,但不包括在捕获中。 '/@([^\s=]+)\s*=\s*([^\s,]+)\s*,?/' 它还允许值和逗号之间有空格。

        2
  •  2
  •   John Kugelman Syzygies    14 年前
    /@(.*?)\s*=\s*(.*?),?/
    

    添加 \s* 在适当的地方匹配空白。使用问号 .*? 不贪婪地匹配。非贪婪的匹配尽可能短的匹配,所以 (.*?),? 将让右边的逗号与逗号匹配,而不是 .* 捕捉逗号。

        3
  •  0
  •   Gumbo    14 年前

    你应该比仅仅使用 . 例如:

    /@([a-zA-Z]+)[ \t]*=[ \t]*([0-9]+|"(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*')[ \t]*,?/
    

    在这里 [a-zA-Z]+ 将名称指定为字母字符序列。接下来是 = 可能被空格或制表符包围。然后这个值要么是一个数字( [0-9]+ ,一个或多个数字的序列)或可能包含转义序列的带引号的字符串( "(?:[^\\"]|\\.)*"|'(?:[^\\']|\\.)*' ,后跟可选空格或制表符。