记录问题,当往数据库存的数据是“积分:9.0/余额:103.25”。但是要给前端把里面的数字单独取出来,让前回显,这时候要不就是往表里新增一个字段作为专门存储积分和余额,要不就是通过代码利用正则表达式取出来,当然,我选择后者。
代码:
package Lx; import java.util.regex.Pattern; public class Matcher { public static void main(String[] args) { double jiFenString = 0; double yuEString = 0; String rewardContent = "积分:9.0/余额:103.25"; String pattern = "(积分|余额):(\\d{1,3}(\\.\\d+)?)"; Pattern r = Pattern.compile(pattern); java.util.regex.Matcher m = r.matcher(rewardContent); while (m.find()) { String type = m.group(1); double value = Double.parseDouble(m.group(2)); if ("积分".equals(type)) { jiFenString = value; } else if ("余额".equals(type)) { yuEString =value; } } System.out.println("jiFenString = "+jiFenString+"\n"+"yuEString = "+yuEString); } }
打印:
正则表达式解释:
这个正则表达式 `(积分|安全):(\\d{1,3}(\\.\\d+)?)` 具体的含义如下:
`(积分|余额)` 表示匹配两个字符串中的任意一个,即要么匹配 "积分",要么匹配 "余额"。这里使用了括号将两个选项进行了分组。
`:` 表示匹配一个冒号字符,用于分隔属性名和属性值。
`(\\d{1,3}(\\.\\d+)?)` 表示匹配一个数字,其整数部分可以由 1 到 3 位数字组成,可选的小数部分由一个小数点和至少一位数字组成。这里同样使用了括号进行了分组。
具体解析:
- `(积分|余额)` 要求要么匹配 "积分",要么匹配 "余额"。
- `:` 要求匹配一个冒号字符。
- `(\\d{1,3}(\\.\\d+)?)` 要求匹配一个数字,整数部分可以由 1 到 3 位数字组成,可选的小数部分由一个小数点和至少一位数字组成。
这个正则表达式适用于匹配形如 "积分:123.45" 或 "安全:99" 这样的字符串,其中 "积分" 或 "余额" 是属性名,而数字部分是对应的属性值。在代码中,使用这个正则表达式可以方便地从字符串中提取出属性名和属性值进行后续处理。
流程解析:
- 定义正则表达式
"(积分|余额):(\\d{1,3}(\\.\\d+)?)";
。 - 使用
Pattern.compile(pattern)
将正则表达式编译成一个Pattern
对象。 - 使用
pattern.matcher(rewardContent)
获取到一个Matcher
对象。 - 在
while (m.find())
循环中,使用Matcher
对象的find()
方法来匹配满足正则表达式规则的字符串部分。 - 若找到匹配,则使用
m.group(1)
和m.group(2)
获取到匹配到的第一个和第二个子字符串(分别代表符合正则表达式的第一个和第二个括号内的内容)。 - 根据
type
的值来判断是哪个属性的值,并将value
设置为相应的属性值。