我正在尝试匹配这样的字符串: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

    09-09 16:52