正则表达式量词 - 两个字符之间的数量
Regex quantifiers - as many between two characters
我正在尝试查找两个字符之间的所有文本,但有时字符串包含分隔符。
例如,如果我使用
(.*?)=(.*?),*
在以下字符串上:
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
如何使正则表达式 return 如下所示? (在逗号字符的最后一次出现处剪切字符串)
match #1: color=blue,red
match #2: weight=100kg
请注意,用逗号分隔的颜色数量可能超过 3 种,或者根本 none。
提前致谢,
玩一下否定字符类,你应该可以将它与
匹配
[^=,]+=(?:[^=,]+|,(?![^,=]+=))+
这匹配
[^=,]+
所有不是逗号或 =
的东西
=
以下=
(?:[^=,]+|,(?=[^,=]+,))+
所有不是逗号或不直接跟在 =
后面且中间没有逗号的逗号 - 尽可能多地重复
您可能会使用这个正则表达式:
[^,]+=[^=]+(?=,)
其中
[^,]+
- 参数名称
[^=]+(?=,)
- 这将捕获参数值,允许包含所有内容,但 =
符号应以逗号结尾。
语义:如果我们要处理整个输入字符串,那么匹配不是任务,拆分才是。
这使得模式更加简单。 ~,(?=[^,]+=)~
您需要匹配逗号(使用它)后跟非逗号,然后是等号。前瞻执行必要的工作,并且 true 定界逗号在此过程中被破坏。
正则表达式 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',
)
我正在尝试查找两个字符之间的所有文本,但有时字符串包含分隔符。
例如,如果我使用
(.*?)=(.*?),*
在以下字符串上:
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
如何使正则表达式 return 如下所示? (在逗号字符的最后一次出现处剪切字符串)
match #1: color=blue,red
match #2: weight=100kg
请注意,用逗号分隔的颜色数量可能超过 3 种,或者根本 none。
提前致谢,
玩一下否定字符类,你应该可以将它与
匹配[^=,]+=(?:[^=,]+|,(?![^,=]+=))+
这匹配
[^=,]+
所有不是逗号或=
的东西
=
以下=
(?:[^=,]+|,(?=[^,=]+,))+
所有不是逗号或不直接跟在=
后面且中间没有逗号的逗号 - 尽可能多地重复
您可能会使用这个正则表达式:
[^,]+=[^=]+(?=,)
其中
[^,]+
- 参数名称
[^=]+(?=,)
- 这将捕获参数值,允许包含所有内容,但 =
符号应以逗号结尾。
语义:如果我们要处理整个输入字符串,那么匹配不是任务,拆分才是。
这使得模式更加简单。 ~,(?=[^,]+=)~
您需要匹配逗号(使用它)后跟非逗号,然后是等号。前瞻执行必要的工作,并且 true 定界逗号在此过程中被破坏。
正则表达式 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',
)