You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 name
  • cutAddressStreet("strassen name-1344") → 返回strassen name
  • cutAddressStreet("strassen name - 1344") → 返回strassen name
  • cutAddressStreet("strassen name,1344") → 返回""

内容的提问来源于stack exchange,提问作者PeVo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 12:05:32