代码之家  ›  专栏  ›  技术社区  ›  Haddock-san

正则表达式量词-两个字符之间的数量

  •  1
  • Haddock-san  · 技术社区  · 7 年前

    例如,如果我使用

    (.*?)=(.*?),*
    

    在以下字符串上:

    color=blue,weight=100kg,
    

    match #1: color=blue
    match #2: weight=100kg
    

    但是,如果我有以下字符串:

    color=blue,red,weight=100kg,
    

    match #1: color=blue
    match #2: red,weight=100kg
    

    如何使正则表达式返回以下内容?(在逗号字符最后一次出现时剪切字符串)

    match #1: color=blue,red
    match #2: weight=100kg
    

    请注意,用逗号分隔的颜色数量可能超过3个,或者根本没有。

    3 回复  |  直到 7 年前
        1
  •  2
  •   ikleschenkov    7 年前

    您可以使用此正则表达式:

    [^,]+=[^=]+(?=,) 哪里

    [^,]+ -参数名称

    [^=]+(?=,) -这将捕获允许包含所有内容的参数值,但是 =

    regex101 example

        2
  •  2
  •   Sebastian Proske    7 年前

    稍微使用否定的角色类,您应该能够将其与

    [^=,]+=(?:[^=,]+|,(?![^,=]+=))+
    

    • [^=,]+ 不是逗号或 =
    • 以下内容 =
    • (?:[^=,]+|,(?=[^,=]+,))+ = 中间没有逗号-尽量重复

    看见 https://regex101.com/r/p8Bz9o/1

        3
  •  0
  •   mickmackusa    5 年前

    语义:如果我们处理整个输入字符串,那么 匹配 正在拆分

    这使得模式更加简单。 ~,(?=[^,]+=)~ 真的 定界逗号在此过程中被销毁。

    正则表达式101: https://regex101.com/r/hwQyhl/1

    PHP实现:( Demo )

    $input = 'color=blue,red,weight=100kg,another=one,two,three,four,okay=enough,';
    
    var_export(preg_split('~,(?=[^,]+=)~', rtrim($input, ','), 0, PREG_SPLIT_NO_EMPTY));
    

    array (
      0 => 'color=blue,red',
      1 => 'weight=100kg',
      2 => 'another=one,two,three,four',
      3 => 'okay=enough',
    )