Java正则分割含01-45编号文本的技术求助
需求说明
需要用Java正则分割文本,分割目标是以01至45的数字开头的内容,数字允许带前导零(如04)或不带前导零(如4)。
示例文本
09 Software for use in assisted driving of railway vehicles; software for electronic railway driving assistance systems; hardware for electronic railway driving assistance systems; driver assistance systems for railway vehicles. 37 Installation and replacement services for railway vehicles, railway vehicles that incorporate driver assistance systems in the detection and avoidance of excessive speed, obstacles, vehicles and people; Software installation and replacement services for railway driving assistance systems and vehicle network coordination centers 42 Supervision services for driving. assistance; systems for railway vehicles; checking railway vehicles; checking railway vehicles that incorporate driver assistance systems
期望输出
index[0]=09 Software for use in assisted driving of railway vehicles; software for electronic railway driving assistance systems; hardware for electronic railway driving assistance systems; driver assistance systems for railway vehicles. index[1]=37 Installation and replacement services for railway vehicles, railway vehicles that incorporate driver assistance systems in the detection and avoidance of excessive speed, obstacles, vehicles and people; Software installation and replacement services for railway driving assistance systems and vehicle network coordination centers index[2]=42 Supervision services for driving. assistance; systems for railway vehicles; checking railway vehicles; checking railway vehicles that incorporate driver assistance systems
解决方案
根据文本是否包含HTML标签,提供两种实现方案:
方案一:先清理HTML标签再提取条目
如果文本带HTML标签,先去除标签再匹配目标内容,代码如下:
import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TextSplitter { public static void main(String[] args) { String originalText = "<p><strong>09</strong> Software for use in assisted driving of railway vehicles; software for electronic railway driving assistance systems; hardware for electronic railway driving assistance systems; driver assistance systems for railway vehicles. <strong>37</strong> Installation and replacement services for railway vehicles, railway vehicles that incorporate driver assistance systems in the detection and avoidance of excessive speed, obstacles, vehicles and people; Software installation and replacement services for railway driving assistance systems and vehicle network coordination centers <strong>42</strong> Supervision services for driving. assistance; systems for railway vehicles; checking railway vehicles; checking railway vehicles that incorporate driver assistance systems</p>"; // 去除所有HTML标签 String cleanText = originalText.replaceAll("<[^>]+>", ""); // 构造正则:匹配01-45数字开头的条目,非贪婪匹配到下一个目标数字或结尾 Pattern pattern = Pattern.compile("(0[1-9]|[1-3][0-9]|4[0-5])\\s+.*?(?=(\\s+(0[1-9]|[1-3][0-9]|4[0-5])|$))", Pattern.DOTALL); Matcher matcher = pattern.matcher(cleanText); ArrayList<String> result = new ArrayList<>(); while (matcher.find()) { result.add(matcher.group().trim()); } // 按要求格式输出 for (int i = 0; i < result.size(); i++) { System.out.println("index[" + i + "]=" + result.get(i)); } } }
方案二:直接匹配带HTML标签的目标条目
如果不想提前清理标签,可直接匹配包含<strong>标签的目标内容,再去除标签得到结果:
import java.util.ArrayList; import java.util.regex.Matcher; import java.util.regex.Pattern; public class TextSplitter { public static void main(String[] args) { String originalText = "<p><strong>09</strong> Software for use in assisted driving of railway vehicles; software for electronic railway driving assistance systems; hardware for electronic railway driving assistance systems; driver assistance systems for railway vehicles. <strong>37</strong> Installation and replacement services for railway vehicles, railway vehicles that incorporate driver assistance systems in the detection and avoidance of excessive speed, obstacles, vehicles and people; Software installation and replacement services for railway driving assistance systems and vehicle network coordination centers <strong>42</strong> Supervision services for driving. assistance; systems for railway vehicles; checking railway vehicles; checking railway vehicles that incorporate driver assistance systems</p>"; // 匹配<strong>包裹的01-45数字及后续文本,直到下一个<strong>数字或结尾 Pattern pattern = Pattern.compile("<strong>(0[1-9]|[1-3][0-9]|4[0-5])</strong>\\s+.*?(?=(<strong>(0[1-9]|[1-3][0-9]|4[0-5])</strong>|$))", Pattern.DOTALL); Matcher matcher = pattern.matcher(originalText); ArrayList<String> result = new ArrayList<>(); while (matcher.find()) { // 去除HTML标签并整理格式 String entry = matcher.group().replaceAll("<[^>]+>", "").trim(); result.add(entry); } // 按要求格式输出 for (int i = 0; i < result.size(); i++) { System.out.println("index[" + i + "]=" + result.get(i)); } } }
正则说明
(0[1-9]|[1-3][0-9]|4[0-5]):精准匹配01-09、10-39、40-45的数字范围\\s+:匹配数字与文本之间的一个或多个空格.*?:非贪婪匹配任意字符,避免过度匹配到后续条目(?=...):正向预查,用于确定条目结束位置(下一个目标数字或文本结尾),不会消耗匹配内容Pattern.DOTALL:让.匹配换行符,兼容带换行的文本
内容的提问来源于stack exchange,提问作者meet patel

