Java中如何使用正则提取含非英文字符的指定位置子串
如何使用正则查找指定位置的字符串
问题描述
现有如下格式的文件名:
choryangStn_110_220114_일_0.sbmchoryangStn_110_220114_이_0.sbmchoryangStn_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");
两种写法均无法正常工作。
问题原因
- Java正则中默认的
\w仅匹配[a-zA-Z0-9_],不包含韩文字符,所以初始正则匹配不到对应位置的韩文。 - 正则的逻辑或语法是单个
|,不存在||的写法,后续尝试的代码里||会被识别为普通竖线字符,完全偏离匹配逻辑。 - 多字符范围匹配不需要用分支或,直接把所有需要匹配的范围放到同一个方括号字符集中即可。
正确实现方式
方法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
相关产品推荐
相关产品推荐

