我需要实现一个函数,该函数以输入的文件名作为输入,并根据正则表达式的规范返回子字符串
文件名是通过这种方式组成的,我需要以粗体显示字符串
Doc20191001119049_ fotocontargasx _3962122_943000.jpg
Doc201810011052053_ fotoAssicurazioneCartaceo _3962128_943000.jpg
Doc201910011214020_ fotoesterna_ant _396024_947112.jpg
Doc201710071149010_ foto_TargaMid _4007396_95010.jpg
我目前已经实现了这一点:
JSONResultActivity = [dataDict objectForKey:@"activity"];
JSONResultEngagement = [dataDict objectForKey:@"Conversation"];
ViewController *vc = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil];
vc.valuesActivity = JSONResultActivity;
vc.valuesEngagement = JSONResultEngagement;
但不能正常工作
答案 0 :(得分:3)
您可以在\w+
之后捕获_
内的[digits][_][digits][.][extension]
模式:
Pattern rexExp = Pattern.compile("_(\\w+)_\\d+_\\d+\\.[^.]*$");
请参见regex demo
详细信息
_
-下划线(\w+)
-1个字母/数字/ _
_
-下划线\d+
-1个以上数字_\d+
-_
和1个以上数字\.
-点[^.]*
-除.
以外的0多个字符$
-字符串的结尾。String s = "Doc201810011052053_fotoAssicurazioneCartaceo_3962128_943000.jpg";
Pattern rexExp = Pattern.compile("_(\\w+)_\\d+_\\d+\\.[^.]*$");
Matcher matcher = rexExp.matcher(s);
if (matcher.find()){
System.out.println(matcher.group(1));
} // => fotoAssicurazioneCartaceo
您可以从一开始就删除所有内容,包括第一个_
,最后一个[digits][_][digits][.][extension]
:
.replaceAll("^[^_]*_|_\\d+_\\d+\\.[^.]*$", "")
详细信息
^[^_]*_
-字符串的开头,除_
以外的0+个字符,然后是_
|
-或_\d+_\d+\.[^.]*$
-_
,1个以上的数字,_
,1个以上的数字,.
,然后是.
以外的0+个字符,直到末尾字符串。答案 1 :(得分:1)
为补充Wiktor精确的answer,这是一种“快速而又肮脏”的方式,它对您的输入做出了以下错误的假设:“必需的字符串仅是非数字,被数字包围,并且输入始终是有效的文件路径。”
public static void main(String[] args) {
String[] strs = {"Doc20191001119049_fotocontargasx_3962122_943000.jpg", "Doc201810011052053_fotoAssicurazioneCartaceo_3962128_943000.jpg", "Doc201910011214020_fotoesterna_ant_396024_947112.jpg", "Doc201710071149010_foto_TargaMid_4007396_95010.jpg"};
var p = Pattern.compile("_([\\D_]+)_");
for(var str : strs) {
var m = p.matcher(str);
if(m.find()) {
System.out.println("found: "+m.group(1));
}
}
}
输出:
found: fotocontargasx
found: fotoAssicurazioneCartaceo
found: fotoesterna_ant
found: foto_TargaMid
答案 2 :(得分:0)
模式:(?<=_).+(?=(_\d+){2}\.)
final String s = "Doc20191001119049_fotocontargasx_3962122_943000.jpg\n"
+ "\n"
+ "Doc201810011052053_fotoAssicurazioneCartaceo_3962128_943000.jpg\n"
+ "\n"
+ "Doc201910011214020_fotoesterna_ant_396024_947112.jpg\n"
+ "\n"
+ "Doc201710071149010_foto_TargaMid_4007396_95010.jpg";
Pattern pattern = Pattern.compile("(?<=_).+(?=(_\\d+){2}\\.)");
Matcher matcher = pattern.matcher(s);
List<String> allMatches = new ArrayList<>();
while (matcher.find()) {
allMatches.add(matcher.group());
}
输出:[fotocontargasx, fotoAssicurazioneCartaceo, fotoesterna_ant, foto_TargaMid]