RegEx,第一场比赛还是最后一场比赛?

RegEx,第一场比赛还是最后一场比赛?,regex,Regex,新加入RegEx的PCRE(PHP)有一个基本问题: 下面是我正在使用的文本字符串,文本是文本 us%3Aks%2Cus%3Aal%2Cus%3Aok%2Cus%3Aia%2Cus%3Ala%2Cus%3Asc%2Cus%3Aut%2Cus%3Act%2Cus%3Aor%2Cus%3Atn%2Cus%3Amo%2Cus%3Aaz%2Cus%3Ain%2Cus%3Amd%2Cus%3Aco%2Cus%3Awi%2Cus%3Awa 获取第一个的目标是使所有内容都达到第一个%2C和第一个%2C->“

新加入RegEx的PCRE(PHP)有一个基本问题:

下面是我正在使用的文本字符串,文本是文本

us%3Aks%2Cus%3Aal%2Cus%3Aok%2Cus%3Aia%2Cus%3Ala%2Cus%3Asc%2Cus%3Aut%2Cus%3Act%2Cus%3Aor%2Cus%3Atn%2Cus%3Amo%2Cus%3Aaz%2Cus%3Ain%2Cus%3Amd%2Cus%3Aco%2Cus%3Awi%2Cus%3Awa
  • 获取第一个的目标是使所有内容都达到第一个%2C和第一个
    %2C
    ->
    “us%3Aks%2C”

  • 获取最后一个的目标是获取最后一个
    %2C
    及其后的所有内容。-><代码>%2Cus%3Awa“

  • 我的尝试有什么错

    1. ^(.+%2C)
    2. (%2C.+)$
    

    您可以将此正则表达式与惰性匹配和贪婪匹配一起使用:

    ^(.*?%2C).+(%2C.*)$
    

    正则表达式详细信息:

    • ^
      :开始
    • (.*?%2C)
      :在组1中匹配0个或多个字符,后跟
      %2C
      (惰性匹配)
    • +
      :匹配任意字符中的一个或多个(贪婪匹配)
    • (%2C.*)
      :在第2组中匹配
      %2C
      ,后跟0个或更多字符
    • $
      :结束

    您可以将此正则表达式与惰性匹配和贪婪匹配一起使用:

    ^(.*?%2C).+(%2C.*)$
    

    正则表达式详细信息:

    • ^
      :开始
    • (.*?%2C)
      :在组1中匹配0个或多个字符,后跟
      %2C
      (惰性匹配)
    • +
      :匹配任意字符中的一个或多个(贪婪匹配)
    • (%2C.*)
      :在第2组中匹配
      %2C
      ,后跟0个或更多字符
    • $
      :结束
    这是一个贪婪的问题,它控制表达式在满足之前会吞下多少个字符。因此,您可以使用
    *?
    ,而不是使用
    +
    。 对于您的案例(1),表达式变为:

    1. ^(.*?%2C)
    
    不幸的是,对于第二种情况,纯粹的惰性匹配没有帮助,但我们实际上必须提前跳过大部分字符串,使用非常贪婪的
    +
    ,因此第二个表达式类似于:

    2. .+(%2C.+)$
    
    这是一个贪婪的问题,它控制表达式在满足之前会吞下多少个字符。因此,您可以使用
    *?
    ,而不是使用
    +
    。 对于您的案例(1),表达式变为:

    1. ^(.*?%2C)
    
    不幸的是,对于第二种情况,纯粹的惰性匹配没有帮助,但我们实际上必须提前跳过大部分字符串,使用非常贪婪的
    +
    ,因此第二个表达式类似于:

    2. .+(%2C.+)$
    
    ^.*?%2C |%2C(?(?!%2C)。*$
    ^.*?%2C |%2C(?(!%2C)。*$