我需要创建匹配此类字符串的正则表达式:
AA+1.01*2.01,BB*2.01+1.01,CC
*和+的顺序应该是任意的 我创建了以下正则表达式:
^(([A-Z][A-Z](([*+][0-9]+(\.[0-9])?[0-9]?){0,2}),)*[A-Z]{2}([*+][0-9]+(\.[0-9])?[0-9]?){0,2})$
但问题是这个正则表达式+或*可以使用两次,但我只需要它们中的任何一个,所以下面的字符串匹配应该是:
AA+1*2,CC - true
AA+1+2,CC - false (now is true with my regex)
AA*1+2,CC - true
AA*1*2,CC - false (now is true with my regex)
答案 0 :(得分:0)
首先应捕获[+*]
,然后使用negative lookahead
匹配另一个。
正则表达式: [A-Z]{2}([+*])(?:\d+(?:\.\d+)?)(?!\1)[+*](?:\d+(?:\.\d+)?),[A-Z]{2}
<强>解释强>
[A-Z]{2}
匹配两个大写字母。
([+*])
捕获+
或*
。
(?:\d+(?:\.\d+)?)
将数字与可选的小数部分匹配。
(?!\1)[+*]
向前看已捕获的符号并与另一个匹配。因此,如果先前已捕获+
,则*
将匹配。
(?:\d+(?:\.\d+)?)
将数字与可选的小数部分匹配。
,[A-Z]{2}
匹配,
后跟两个大写字母。
<强> Regex101 Demo 强>
要匹配第一个案例AA+1.01*2.01,BB*2.01+1.01,CC
,这比先前的模式稍微提升一点,请使用以下正则表达式。
正则表达式: (?:[A-Z]{2}([+*])(?:\d+(?:\.\d+)?)(?!\1)[+*](?:\d+(?:\.\d+)?),)+[A-Z]{2}
说明:在第一组中添加除,CC
之外的整个模式,并使用+
匹配一个或多个此类模式,使其变得贪婪。
<强> Regex101 Demo 强>
答案 1 :(得分:0)
要获得与您给定示例相匹配的正则表达式,扩展为任意数量的逗号,您可以使用:
^(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\1)[+*]?\d*\.?\d*,?)*$
请注意,此示例还允许使用尾随逗号。我不确定你能做些什么。
如果尾随逗号是个问题:
^(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\1)[+*]?\d*\.?\d*,?)*?(?:[A-Z]{2}([+*])?\d*\.?\d*(?!\2)[+*]?\d*\.?\d*?)$