使用regExp返回子字符串[Java]

时间:2019-10-10 13:59:32

标签: java android regex regexp-substr

我需要实现一个函数,该函数以输入的文件名作为输入,并根据正则表达式的规范返回子字符串

文件名是通过这种方式组成的,我需要以粗体显示字符串

  

Doc20191001119049_ fotocontargasx _3962122_943000.jpg

     

Doc20181001105205​​3_ 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;

但不能正常工作

3 个答案:

答案 0 :(得分:3)

解决方案1:匹配/提取

您可以在\w+之后捕获_内的[digits][_][digits][.][extension]模式:

Pattern rexExp = Pattern.compile("_(\\w+)_\\d+_\\d+\\.[^.]*$");

请参见regex demo

详细信息

  • _-下划线
  • (\w+)-1个字母/数字/ _
  • _-下划线
  • \d+-1个以上数字
  • _\d+-_和1个以上数字
  • \.-点
  • [^.]*-除.以外的0多个字符
  • $-字符串的结尾。

Online Java demo

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

解决方案2:修剪掉不必要的前缀/后缀

您可以从一开始就删除所有内容,包括第一个_,最后一个[digits][_][digits][.][extension]

.replaceAll("^[^_]*_|_\\d+_\\d+\\.[^.]*$", "")

请参见this regex demo

详细信息

  • ^[^_]*_-字符串的开头,除_以外的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]