我需要根据以下格式的正则表达式拆分字符串。
有 3 种不同类型的字符串值 -
- ABC_1234_XL.jpg
- XYZ_7890_SM.jpg
- PQ_R_4567_LG.jpg
我现在无法使用的正则表达式是 -
(^[a-zA-Z])(_\\d+_)([a-zA-Z]$)
在上面的ABC
中,XYZ
和PQ_R
是我想分别提取的3种图像类型,并与各自的列表进行比较从数据库中获取的相应类型。
因此,如果我使用下划线“_”进行正常拆分,那么它在拆分第 3 个字符串时就达不到目的了。
所以我需要一个基于正则表达式拆分这些字符串的解决方案,其中每次中心元素都是 [0-9],左边是图像类型,右边是图像大小。
含义 - ImageType_ImageTypeID_ImageSize
。我们需要以中心元素 (imageTypeID)
为基础拆分它,并通过排除“_”来获取左右日期。
如何使用 Split 和 Regex 实现这一点?
请帮忙,如果您需要更多信息,请告诉我。
最佳答案
好的,既然还没有人解释你的问题,那我试试。您当前的正则表达式
(^[a-zA-Z])(_\\d+_)([a-zA-Z]$)
只能匹配以一个字母开头、_
、一个或多个数字、另一个_
并以一个字母结尾的字符串。你需要的是接受字符串的正则表达式
[a-zA-Z]+(?:_[a-zA-Z]+)*
- 以一个或多个字母开头,可以有可选的_
和字母的序列(还不是数字)_\\d+_
- 数字后面有_
[a-zA-Z]+
后面有一个或多个字母。您可能还想以匹配文件扩展名的序列结束正则表达式,因此您需要像
[.]jpg
所以试试
([a-z]+(?:_[a-z]+)*)_(\\d+)_([a-z]+)[.]jpg
演示:
String[] data = {
"ABC_1234_XL.jpg",
"XYZ_7890_SM.jpg",
"PQ_R_4567_LG.jpg",
};
Pattern p = Pattern.compile(
"([a-z]+(?:_[a-z]+)*)_(\\d+)_([a-z]+)[.]jpg",
//group 1 ^^^^^^^^^^^^^^^^^^
//group 2 ^^^^
//group 3 ^^^^^^
Pattern.CASE_INSENSITIVE);
for (String s : data) {
Matcher m = p.matcher(s);
if (m.matches())
System.out.println(m.group(1)+" : "+m.group(2)+" : "+m.group(3));
else
System.out.println(s+" doesn't match pattern");
}
输出:
ABC : 1234 : XL
XYZ : 7890 : SM
PQ_R : 4567 : LG
关于java - 基于java中的正则表达式拆分成不同的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24090264/