RegEx,第一场比赛还是最后一场比赛?
新加入RegEx的PCRE(PHP)有一个基本问题: 下面是我正在使用的文本字符串,文本是文本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->“
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
->“us%3Aks%2C”
%2C
及其后的所有内容。-><代码>%2Cus%3Awa“1. ^(.+%2C)
2. (%2C.+)$
您可以将此正则表达式与惰性匹配和贪婪匹配一起使用:
^(.*?%2C).+(%2C.*)$
正则表达式详细信息:
:开始^
:在组1中匹配0个或多个字符,后跟(.*?%2C)
(惰性匹配)%2C
:匹配任意字符中的一个或多个(贪婪匹配)+
:在第2组中匹配(%2C.*)
,后跟0个或更多字符%2C
:结束$
^(.*?%2C).+(%2C.*)$
正则表达式详细信息:
:开始^
:在组1中匹配0个或多个字符,后跟(.*?%2C)
(惰性匹配)%2C
:匹配任意字符中的一个或多个(贪婪匹配)+
:在第2组中匹配(%2C.*)
,后跟0个或更多字符%2C
:结束$
*?
,而不是使用+
。
对于您的案例(1),表达式变为:
1. ^(.*?%2C)
不幸的是,对于第二种情况,纯粹的惰性匹配没有帮助,但我们实际上必须提前跳过大部分字符串,使用非常贪婪的+
,因此第二个表达式类似于:
2. .+(%2C.+)$
这是一个贪婪的问题,它控制表达式在满足之前会吞下多少个字符。因此,您可以使用*?
,而不是使用+
。
对于您的案例(1),表达式变为:
1. ^(.*?%2C)
不幸的是,对于第二种情况,纯粹的惰性匹配没有帮助,但我们实际上必须提前跳过大部分字符串,使用非常贪婪的+
,因此第二个表达式类似于:
2. .+(%2C.+)$
^.*?%2C |%2C(?(?!%2C)。*$
^.*?%2C |%2C(?(!%2C)。*$