我要求基于正则表达式拆分字符串,该表达式将具有以下格式。
有3种不同类型的字符串值 -
我现在正在使用的正则表达式是 -
(^[a-zA-Z])(_\\d+_)([a-zA-Z]$)
上面ABC
中的,XYZ
和PQ_R
是我想要分别提取的3种类型的图像类型,并将其与从DB中提取的相应类型的相应列表进行比较。
因此,如果我使用下划线“_”进行正常分割,那么在分割第3个字符串时它会淹没目的。
所以我需要一个基于正则表达式拆分这些字符串的解决方案,每次中心元素为[0-9],左边是图像类型,右边是图像尺寸。
含义 - ImageType_ImageTypeID_ImageSize
。我们需要将中心元素(imageTypeID)
作为基础进行拆分,然后得到左边的&正确的日期,不包括“_”。
如何使用Split和Regex实现这一目标?
请帮助,如果您需要更多信息,请告知我们。
答案 0 :(得分:2)
好的,因为还没有人解释你的问题然后我会尝试。你当前的正则表达式
(^[a-zA-Z])(_\\d+_)([a-zA-Z]$)
只能匹配开头的一个字母,_
,一个或多个数字,另一个_
并以一个字母结尾的字符串。你需要的是接受字符串
[a-zA-Z]+(?:_[a-zA-Z]+)*
- 以一个或多个字母开头,可以包含_
和字母(不是数字)的可选序列_\\d+_
- 在{/ 1>}之后用_
包围数字
[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
答案 1 :(得分:0)
试试这个:
([A-ZA-Z] [_] [A-ZA-Z] *)( \ d + )([\ W] + [。] [\ W] +)
第一组查找尽可能多的字符或_ 第二组找到 123123 模式 最后一个可以获得尺寸和类型。
答案 2 :(得分:0)
如果允许第一部分包含_
,我认为将其包含在该块的字符列表中就足够了:
(^[a-zA-Z_]+)(_\\d+_)([a-zA-Z]+)
您甚至可以将分隔符放在中心区域之外:
(^[a-zA-Z_]+)_(\\d+)_([a-zA-Z]+)
答案 3 :(得分:-1)
^([A-Za-z_]+)_(\\d+)_([A-Za-z]+)\\.jpg$