我正在尝试匹配这样的字符串:62.00|LQ+2*2,FP,MD*3 "Description"
如果十进制值为2位数字(可选),则每个用户的特征是两个字符,其后可以跟
(\ + [\ d] +)?或(\ * [\ d] +)?或没有,或两者都以不同的顺序出现
喜欢:
LQ * 2 + 4 | LQ + 4 * 2 | LQ * 2 | LQ + 8 | LQ
说明也是可选的
我试过的是:
Pattern.compile("^(?<number>[\\d]+(\\.[\\d]{2})?)\\|(?<users>([A-Z]{2}){1}(((\\+[\\d]+)?(\\*[\\d]+)?)|((\\+[\\d]+)?(\\*[\\d]+)?))((,[A-Z]{2})(((\\+[\\d]+)?(\\*[\\d]+)?)|((\\+[\\d]+)?(\\*[\\d]+)?)))*)(\\s\\\"(?<message>.+)\\\")?$");
我需要获得所有用户,以便我可以用','分割用户,然后进一步将它进行正则表达式处理。但是我无法从中获取任何东西。
62.00 | LQ + 2 * 2,FP,MD * 3“描述”
应该:
62.00
LQ + 2 * 2,FP,MD * 3
描述
接受的输入应为以下类型:
62.00 | LQ + 2 * 2,FP,MD * 3
30 | LQ“汉堡”
35.15 | LQ * 2,FP + 2 * 4,MD * 3 + 4“土豆”
35.15 | LQ,FP,MD
最佳答案
该正则表达式应满足与您描述的输入相匹配的精确正则表达式,
^(\d+(?:\.\d{1,2})?)\|([a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?(?:,[a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?)*)(?: +(.+))?$
其中group1将包含最多可以有两位数字的可选小数,而group2将具有您在帖子中描述的逗号分隔输入,而group3将包含可选描述(如果存在)。
正则表达式说明:
^
-字符串(\d+(?:\.\d{1,2})?)
-匹配十进制后可以有可选两位数字的数字,并将其捕获在group1中\|
-匹配数字|
([a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?(?:,[a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?)*)
-这部分匹配两个字母,后跟+
的任意组合,然后加上数字,还可以选择先有*
,然后再加上数字,或者先是*
,再加上数字,然后再有+
,再加上数字,恰好一次或全部是可选的,并将其捕获在group2中(?: +(.+))?
-匹配可选描述并将其捕获到group3 $
-标记输入Regex Demo