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

Java中如何使用正则提取含非英文字符的指定位置子串

如何使用正则查找指定位置的字符串

问题描述

现有如下格式的文件名:

  • choryangStn_110_220114_일_0.sbm
  • choryangStn_110_220114_이_0.sbm
  • choryangStn_110_220114_삼_0.sbm
    需要提取上述文件名中的일、이、삼字符。
    最初尝试的实现代码:
String filename = "choryangStn_110_220114_일_0.sbm";
filename.replaceAll(".*_(\\w+)_\\d+\\.\\w+", "$1");

该写法无法正常生效。需求是让正则可以同时匹配\w和[가-힣](韩文范围字符),后续先后尝试了两种写法:

filename.replaceAll(".*_(\\w+)||[가-힣]_\\d+\\.\\w+", "$1");
filename.replaceAll(".*_(\\w+||[가-힣])_\\d+\\.\\w+", "$1");

两种写法均无法正常工作。

问题原因

  1. Java正则中默认的\w仅匹配[a-zA-Z0-9_],不包含韩文字符,所以初始正则匹配不到对应位置的韩文。
  2. 正则的逻辑或语法是单个|,不存在||的写法,后续尝试的代码里||会被识别为普通竖线字符,完全偏离匹配逻辑。
  3. 多字符范围匹配不需要用分支或,直接把所有需要匹配的范围放到同一个方括号字符集中即可。

正确实现方式

方法1:合并字符匹配范围

直接把韩文范围加入匹配的字符集,不需要额外分支:

String filename = "choryangStn_110_220114_일_0.sbm";
String target = filename.replaceAll(".*_([\\w가-힣]+)_\\d+\\.\\w+", "$1");

运行后target的值就是需要提取的韩文字符。

方法2:开启Unicode匹配模式

在正则前加(?U)标记,让\w支持匹配所有Unicode文字字符(包含韩文、中文等非ASCII文字),写法更简洁:

String filename = "choryangStn_110_220114_일_0.sbm";
String target = filename.replaceAll(".*_(?U)(\\w+)_\\d+\\.\\w+", "$1");

方法3:字符串分割(无正则写法)

如果文件名格式完全固定,用字符串分割的方式更简单,不需要考虑正则兼容问题:

String filename = "choryangStn_110_220114_일_0.sbm";
// 先去除文件后缀,再按下划线分割
String[] segments = filename.substring(0, filename.lastIndexOf('.')).split("_");
String target = segments[3]; // 分割后第4段就是目标字符

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 22:36:37