用于匹配特殊模式的java正则表达式
我正在尝试匹配如下字符串:62.00|LQ+2*2,FP,MD*3 "Description"
如果十进制值为2位可选数字,则每个用户都有两个字符,后面可以跟
(\+[\d]+)? or (\*[\d]+)? or none, or both, or both in different order
比如:
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 "Description"
应该是:
62.00
LQ+2*2,FP,MD*3
Description
接受的输入应为以下类型:
62.00|LQ+2*2,FP,MD*3
30|LQ "Burgers"
35.15|LQ*2,FP+2*4,MD*3+4 "Potatoes"
35.15|LQ,FP,MD
# 1 楼答案
与您描述的输入匹配的精确正则表达式应由该正则表达式实现
其中,group1将包含最多两位可选小数的数字,group2将包含您在文章中描述的逗号分隔输入,group3将包含可选描述(如果存在)
正则表达式的解释:
^
-字符串的开头(\d+(?:\.\d{1,2})?)
-匹配小数后可以有两位可选数字的数字,并在group1中捕获该数字\|
-匹配输入中数字后面的文字|
([a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?(?:,[a-zA-Z]{2}(?:(?:\+\d+(?:\*\d+)?)|(?:\*\d+(?:\+\d+)?))?)*)
-此部分匹配两个字母,后跟+
后跟数字的任意组合,可选地将*
后跟数字或*
后跟数字,可选地将+
后跟数字的任意组合,一次或全部都是可选的,并将其捕获到组2中(?: +(.+))?
-这与可选描述相匹配,并在group3中捕获它$
-标记输入结束Regex Demo
# 2 楼答案
我猜我们这里有几个可选组,这可能不是问题。我遇到的问题是,我不太确定我们的输入范围和期望的输出范围
正则表达式1
我猜,如果我们只是匹配所有内容,我们可能会从类似的内容开始:
在这里,我们只需在每个子表达式之后添加一个
?
,然后使用字符列表和量词,并开始从左向右滑动所有内容,以覆盖所有输入如果我们喜欢捕获,那么我们只需用一个捕获组
()
包装我们想要捕获的任何部分Demo
测试
正则表达式2
如果我们希望输出列出的三组:
Demo 2
测试
正则表达式3
根据更新的所需输出,这可能会起作用:
DEMO