Java使用正则表达式提取商品规格信息

ops/2024/9/25 6:22:02/

需求

从不方便透露的网站爬取了一批商品数据,需要从商品名中获取规格。规格可能以 “ml”、“g”、“pcs” 等单位表示,也可能带有乘积符号 “x”(如 “2x30ml”),或者是多个规格组合(如 “50ml + 30ml”)。大概就是下面这种样子

java">List<String> strings = Lists.newArrayList("幸运润手霜八支装 8x30ml","赋能焕采眼霜 双瓶装 2x1.5g","赋能焕采眼霜 双瓶装 2x1.5g + 50g","多方位pitera™ 保湿修护套组 2x2.30ml + 100ml","特润修护肌活精华露和充盈紧弹眼霜套装 50ml + 15ml","紫胖子卸妆膏(面部及眼部卸妆霜) 12.5ml + 30ml + 15ml","紫胖子卸妆膏(面部及眼部卸妆霜) 1.25g + 30mg + 15mg","夜间密集修护套装 150ml + 100ml + 50ml + 75ml + 15ml","夜间密集修护套装 150mg + 100mg + 50mg + 75mg + 15mg","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5g","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5Pcs","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27pcs 27pcs","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5ML 27.5ml","海蓝之谜修护精萃沁润面膜 保湿修护面膜 #128","Dior Rouge Forever Stick 3.2g 729 Cool Taupe","Dior Prestige Le Micro Fluid Teint De Rose Foundation Illuminateur Spf25 30ml 1N Neutral","护肤面膜 两盒装 2x10 pcs"
);

代码实现

使用正则表达式匹配:
java">import com.google.common.collect.Lists;import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @date 2024/9/13 16:42* @description:*/
public class DemoController {private static final Pattern PATTERN = Pattern.compile("(\\d+(?:\\.\\d+)?\\s*(?:x\\s*\\d+(?:\\.\\d+)?)?\\s*(?:ml|g|pcs|l|cl|mg|kg)\\s*(?:\\+\\s*)?|#\\d+\\s*)+", Pattern.CASE_INSENSITIVE);public static void main(String[] args) {List<String> strings = Lists.newArrayList("幸运润手霜八支装 8x30ml","赋能焕采眼霜 双瓶装 2x1.5g","赋能焕采眼霜 双瓶装 2x1.5g + 50g","多方位pitera™ 保湿修护套组 2x2.30ml + 100ml","特润修护肌活精华露和充盈紧弹眼霜套装 50ml + 15ml","紫胖子卸妆膏(面部及眼部卸妆霜) 12.5ml + 30ml + 15ml","紫胖子卸妆膏(面部及眼部卸妆霜) 1.25g + 30mg + 15mg","夜间密集修护套装 150ml + 100ml + 50ml + 75ml + 15ml ","夜间密集修护套装 150mg + 100mg + 50mg + 75mg + 15mg ","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5g","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5Pcs","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27pcs 27pcs","海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5ML 27.5ml","海蓝之谜修护精萃沁润面膜 保湿修护面膜 #128","Dior Rouge Forever Stick 3.2g 729 Cool Taupe","Dior Prestige Le Micro Fluid Teint De Rose Foundation Illuminateur Spf25 30ml 1N Neutral","护肤面膜 两盒装 2x10 pcs");for (String string : strings) {String specification = "";Matcher matcher = PATTERN.matcher(string);if (matcher.find()) {// 如果匹配成功,打印出规格specification = matcher.group();// 去重规格项specification = removeDuplicates(specification);}System.out.println("name: " +  string + "  >>>>>> 规格 " + specification);}}// 去重并保持原有顺序private static String removeDuplicates(String specification) {if (specification.contains("+") || specification.contains("x")) {return specification;}String[] parts = specification.split("\\s+");Set<String> uniqueParts = new LinkedHashSet<>();for (String part : parts) {uniqueParts.add(part.toLowerCase());}return String.join(" ", uniqueParts);}
}

正则表达式分析:

  1. 正则表达式匹配规则
  • \\d+(?:\\.\\d+)?: 匹配整数或小数,如 “8” 或 “8.5”。
  • (?:x\\s*\\d+(?:\\.\\d+)?)?: 匹配乘积符号 “x” 和数量,如 “2x30ml”。
  • (ml|g|pcs|l|cl|mg|kg): 匹配常见的规格单位,如 “ml”、“g”、“pcs” 等。
  • (\\+\\s*)?: 匹配加号 “+”,表示多个规格组合,如 “50ml + 30ml”。
  1. 匹配逻辑
  • 使用 matcher.find() 方法查找商品名称中的规格部分。匹配成功后,提取规格信息。
  • 将匹配到的规格字符串传入 removeDuplicates 方法中,进行去重处理。
  1. 去重逻辑
  • 使用 LinkedHashSet 来去重并保持原有顺序。将规格字符串按空格分隔后,逐一加入 LinkedHashSet 中,最终通过 String.join() 将去重后的部分拼接起来。

输出结果:

java">name: 幸运润手霜八支装 8x30ml  >>>>>> 规格 8x30ml
name: 赋能焕采眼霜 双瓶装 2x1.5g  >>>>>> 规格 2x1.5g
name: 赋能焕采眼霜 双瓶装 2x1.5g + 50g  >>>>>> 规格 2x1.5g + 50g
name: 多方位pitera™ 保湿修护套组 2x2.30ml + 100ml  >>>>>> 规格 2x2.30ml + 100ml
name: 特润修护肌活精华露和充盈紧弹眼霜套装 50ml + 15ml  >>>>>> 规格 50ml + 15ml
name: 紫胖子卸妆膏(面部及眼部卸妆霜) 12.5ml + 30ml + 15ml  >>>>>> 规格 12.5ml + 30ml + 15ml
name: 紫胖子卸妆膏(面部及眼部卸妆霜) 1.25g + 30mg + 15mg  >>>>>> 规格 1.25g + 30mg + 15mg
name: 夜间密集修护套装 150ml + 100ml + 50ml + 75ml + 15ml   >>>>>> 规格 150ml + 100ml + 50ml + 75ml + 15ml 
name: 夜间密集修护套装 150mg + 100mg + 50mg + 75mg + 15mg   >>>>>> 规格 150mg + 100mg + 50mg + 75mg + 15mg 
name: 海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5g  >>>>>> 规格 27.5g
name: 海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5Pcs  >>>>>> 规格 27.5pcs
name: 海蓝之谜修护精萃沁润面膜 保湿修护面膜 27pcs 27pcs  >>>>>> 规格 27pcs
name: 海蓝之谜修护精萃沁润面膜 保湿修护面膜 27.5ML 27.5ml  >>>>>> 规格 27.5ml
name: 海蓝之谜修护精萃沁润面膜 保湿修护面膜 #128  >>>>>> 规格 #128
name: Dior Rouge Forever Stick 3.2g 729 Cool Taupe  >>>>>> 规格 3.2g
name: Dior Prestige Le Micro Fluid Teint De Rose Foundation Illuminateur Spf25 30ml 1N Neutral  >>>>>> 规格 30ml
name: 护肤面膜 两盒装 2x10 pcs  >>>>>> 规格 2x10 pcs

我当然不会试图摘月,我要月亮奔我而来。 --奥黛丽·赫本


http://www.ppmy.cn/ops/115657.html

相关文章

TCP协议基础

网络运输层之(1)TCP协议基础 Author: Once Day Date: 2024年9月12日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 通信网络技术_Once-Day的博客…

Ubuntu中常用的操作指令

ubuntu中常通过在命令行中输入各种指令完成操作。 文件操作指令 ls&#xff1a;列出目录内容 ls cd&#xff1a;改变当前目录 # 进入指定目录 cd /path/to/directory # 返回上一级目录 cd .. # 返回用户主目录 cd ~ cp&#xff1a;复制文件或目录 # 复制文件 …

Unity 热更新(HybridCLR+Addressable)-设置打包路径和加载路径、打开Hosting服务、打包

四、设置打包和加载路径 五、打开Hosting服务 六、打包 打包完成后路径在Assets同级目录下的ServerData 但是目前没有资源文件对比 修改上面设置后再次打包 里面多了哈希和JSON文件&#xff0c;这俩个就是用于资源对比

JVM 性能调优与监控

Java 虚拟机&#xff08;JVM&#xff09;是运行 Java 应用程序的核心组件。随着应用程序的复杂度和规模不断增大&#xff0c;JVM 的性能调优和监控变得尤为重要。本文将详细介绍 JVM 性能调优的基本概念、常见性能问题、解决方案、监控工具以及最佳实践。 1. JVM 性能调优概述…

5G技术对IT行业的影响及未来发展

5G技术对IT行业的影响及未来发展 随着5G网络的快速部署&#xff0c;全球正进入一个全新的高速连接时代。5G不仅仅是移动通信的升级&#xff0c;它将带来更多的应用场景和改变各个行业的运作方式。本文将探讨5G技术的核心特点、对IT行业的影响&#xff0c;以及未来可能的发展方向…

Firefox火狐浏览器web开发调试开启强制刷新缓存模式

场景:vuetoken过期或者修改token后&#xff0c;刷新后进不去系统! 解决&#xff1a; 火狐浏览器缓存难清理&#xff0c;用CtrlF5 CtrlR 等在谷歌和IE浏览器的快捷键没用。 火狐清理缓存比较麻烦&#xff0c;默认快捷键 Ctrl Shift Del 键是弹窗选择性清理&#xff0c;还要…

Qt窗口——QMenuBar

文章目录 QMenuBar示例演示给菜单栏设置快捷键给菜单项设置快捷键添加子菜单添加分割线添加图标 QMenuBar Qt中采用QMenuBar来创建菜单栏&#xff0c;一个主窗口&#xff0c;只允许有一个菜单栏&#xff0c;位于主窗口的顶部、主窗口标题栏下面&#xff1b;一个菜单栏里面有多…

字符串——String

目录 1:String概述 2.String注意点 3.创建String对象的二种方法 4.字符串的比较 4.1&#xff1a;号比的是什么&#xff1f; 4.1.1&#xff1a;基本数据类型&#xff08;比较的是数据值&#xff09; 4.1.2&#xff1a;引用数据类型&#xff08;比较的是地址&#xff09; …