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

Posted

技术标签:

【中文标题】正则表达式量词 - 两个字符之间的数量【英文标题】:Regex quantifiers - as many between two characters 【发布时间】:2017-08-02 13:42:44 【问题描述】:

我正在尝试查找两个字符之间的所有文本,但有时字符串包含分隔符。

例如,如果我使用

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

在以下字符串上:

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

提前致谢,

【问题讨论】:

不要使用点来描述键,而是使用不包括逗号(以及等号)的字符类。 正则表达式应该适合什么语言/环境?你是如何实现这个模式的。我们需要在问题上添加语言标签。 @Haddock @mickmackusa 该问题已在 2 年前得到解答,但感谢您的关注!您可以在多种环境和语言中使用正则表达式。我的问题是以正则表达式语法为中心并且独立于任何编程语言。 这是一个相当不幸的字符串,您正在尝试解析。当值可以包含分隔符时,是时候重新审视数据结构了。 您的示例文本是整个字符串吗?还是文本是大部分文本的子字符串?拆分函数调用可以吗?您的输入如何变化?是否有两个以上的子字符串?越来越少? 【参考方案1】:

你可以使用这个正则表达式:

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

[^,]+ - 参数名称

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

regex101 example

【讨论】:

所以([^,]+=[^=]+(?=,)),(.*)【参考方案2】:

稍微玩一下否定字符类,你应该能够匹配它

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

这匹配

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

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

【讨论】:

【参考方案3】:

语义:如果我们正在处理整个输入字符串,那么 matching 不是任务,splitting 是。

这使模式更加简单。 ~,(?=[^,]+=)~ 您需要匹配逗号(使用它),后跟非逗号,然后是等号。前瞻完成了必要的工作,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',
)

【讨论】:

以上是关于正则表达式量词 - 两个字符之间的数量的主要内容,如果未能解决你的问题,请参考以下文章

python-正则表达式

正则表达式量词加号和星号之间的区别

java正则表达式-量词

java正则表达式-量词

python正则表达式

6.正则表达式