Java正则匹配问题:无法正确提取含特定分隔符的街道名称
正则匹配问题修复方案
问题根源
你的正则表达式^(.*)( - |[ _\-\.])(\d{1,5})(.*)$中,(.*)是贪婪匹配,会尽可能捕获最长的字符序列。在处理strassen name - 1344时,贪婪模式会把strassen name -全部纳入$1,只留下空格给后面的分隔符匹配(空格属于[ _-.]范围),导致返回结果多出-。
修复方案
将贪婪匹配改为非贪婪匹配,同时用非捕获组优化分隔符匹配逻辑,确保优先识别完整的-分隔符:
修改后的正则表达式:
String sRegEx = "^(.*?)(?: - |[ _\\-.])(\\d{1,5})(.*)$";
关键改动说明:
(.*?):非贪婪匹配,仅捕获到第一个分隔符前的内容,避免过度捕获(?:...):非捕获组,不生成额外的捕获分组,保证$1始终指向街道名称部分- 优先匹配
-,再匹配单个分隔符(空格、下划线、短横、点),避免拆分错误
修改后的完整代码
public static String cutAddressStreet(String sFull) { String sRet = ""; // 替换为修复后的正则 String sRegEx = "^(.*?)(?: - |[ _\\-.])(\\d{1,5})(.*)$"; if (sFull.matches(sRegEx)) { // 判定为含门牌号的街道地址 String sStreet = sFull.replaceFirst(sRegEx, "$1"); System.out.println("cut=\"" + sStreet + "\" from " + sFull); sRet = sStreet; } return sRet; }
测试验证
修复后所有测试用例均符合预期:
cutAddressStreet("strassen name 1344")→ 返回strassen namecutAddressStreet("strassen name-1344")→ 返回strassen namecutAddressStreet("strassen name - 1344")→ 返回strassen namecutAddressStreet("strassen name,1344")→ 返回""
内容的提问来源于stack exchange,提问作者PeVo
相关产品推荐
相关产品推荐

