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



我试图找到两个字符之间的所有文本,但有时字符串包含分隔符。

例如,如果我使用

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

在以下字符串上:

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 种,或者根本没有。

提前感谢,

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

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

[^,]+- 参数名称

[^=]+(?=,)- 这将捕获参数值,允许包含所有内容,但=符号,应以逗号结尾。

正则表达式101

示例

稍微玩一下否定字符类,你应该能够将其与

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

这匹配

  • [^=,]+所有不是逗号或=的内容
  • =以下=
  • (?:[^=,]+|,(?=[^,=]+,))+所有不是逗号或逗号后不直接跟=且中间没有逗号的内容 - 尽可能频繁地重复

请参阅 https://regex101.com/r/p8Bz9o/1

语义:如果我们处理的是整个输入字符串,那么匹配不是任务,拆分才是。

这使得模式更加简单。~,(?=[^,]+=)~您需要匹配逗号(使用它(,后跟非逗号,然后是等号。 前瞻会完成必要的工作,在此过程中会破坏真正的分隔逗号。

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

一个PHP实现:(演示(

$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',
)

最新更新