java - 正则表达式模式与目录内的文件名不匹配

标签 java regex

我开发此代码是为了解析目录内的图像文件名,有两种类型的文件,照片和图像,因此每种文件都有不同的文件名模式,所以我想出了这种方法,查看文件夹内部并获取所有图像(照片和图像)的列表,然后匹配正确的模式以获得值。

问题是由于某种原因正则表达式模式与文件名不匹配,我已经使用此链接 https://regex101.com/r/cvuEfR/3 检查了语法和模式验证它们。

所以我认为问题出在其他地方,但我不明白。

文件结构和文件如下所示

resource_files
  |_Photos
    |_1
      RD1500-0001-1-P.JPG
      RD1500-0001-2-P.JPG
    |_2
      RD1500-0002-1-P.JPG
      RD1500-0002-2-P.JPG
  |_Images
    |_1
      |_extL       
        R0001A+01.01B+01-extL.JPG
        R0001A+01.10B+82-extL.JPG
    |_1
      |_extR       
        R0002A+10.10B+23-extL.JPG
        R0002A+01.10B+06-extL.JPG

我正在按如下方式解析照片的值

RD1500-0001-1-P.JPG
1500
0001
1
P

对于图像:

R0002A+10.10B+23-extL.JPG
0002
10.10
23
extL

public class ImageNameParser implements IImageNameProcessor {

    private static final String PHOTO_PATTERN="([A-Za-z0-9]+)-(\\d\\d\\d\\d)-(\\d)-([A-Za-z]+)";
    private Pattern photoPattern = Pattern.compile(PHOTO_PATTERN);

    private static final String IMAGE_PATTERN="([A-Za-z0-9]+)(\\d\\d\\d\\d)([A-Za-z0-9]+)[\\+](\\d\\d.\\d\\d)([A-Za-z0-9]+)[\\+](\\d\\d)-([A-Za-z0-9]+)";
    private Pattern imagePattern = Pattern.compile(IMAGE_PATTERN);

    private ImageHierarchy extractType1Info(File imageFile,String tag,String group) throws Exception {

        if (imageFile!=null && imageFile.isFile()) {
            Matcher m = imagePattern.matcher(imageFile.getName());
            if (m.find()) {

                /*    m.group(1) - 
                      m.group(2) - SubGroup
                          m.group(3) - 
                      m.group(4) - ValueA
                      m.group(5) -                    
                                      m.group(6) - ValueB
                      m.group(7) - SubType  
                 */
                ImageHierarchy imageData = new ImageHierarchy(imageFile.getName(), imageFile.getAbsolutePath(), m.group(2), tag, group);
                imageData.addImageParameters(m.group(4), m.group(6),m.group(7), null, null);
                return imageData;

            } else {
                return null;
            }

        } else {
            return null;
        }
    }

    private ImageHierarchy extractType2Info(File imageFile,String tag,String group) {

        if (imageFile!=null && imageFile.isFile()) {

            Matcher patternMatcher = photoPattern.matcher(imageFile.getName());

            if (patternMatcher.find()) {
                /*
                     patternMatcher.group(1) - Group
                     patternMatcher.group(2) - SubGroup
                     patternMatcher.group(3) - SequenceNumber
                     patternMatcher.group(4) - PhotoAtribute
                 */

                ImageHierarchy imageData = new ImageHierarchy(imageFile.getName(), imageFile.getAbsolutePath(), patternMatcher.group(2), tag, patternMatcher.group(1));
                imageData.addImageParameters(null, null,null, patternMatcher.group(3), patternMatcher.group(4));
                return imageData;
            } 
        } 
        return null;
    }

    private File[] getFiles(File folder ,String group, String tag){

        ArrayList<File> fileList= new ArrayList<File>();

        if(folder!=null)
        {
            ArrayList<File> directories = new ArrayList<File>();
            directories.add(folder);

            while(!directories.isEmpty() && (folder = directories.remove(0))!=null) {
                File[] listOfFiles = folder.listFiles();
                if(listOfFiles!=null)
                {
                    for ( File file : listOfFiles) {
                        if(file.isFile()){

                            if((group!=null && file.getName().contains(group)) || (tag!=null && file.getName().contains(tag))){
                                System.out.println(file.getName());
                                fileList.add(file);
                            }

                        } else if(file.isDirectory()){
                            directories.add(file);                   
                        }
                    }
                }

            }
        }
        return fileList.toArray(new File[]{});

    }

    public ProcessedImages process(File folder ,String group,String tag) throws Exception{

        ImageHierarchy imageInfo = null;

        ProcessedImages collection = new ProcessedImages();
        File[] imageFiles = getFiles(folder, group, tag);
        for (File imageFile : imageFiles) {
            imageInfo = extractType1Info(imageFile, tag, group);
            if(imageInfo!=null)
            {
                collection.AddImage(imageInfo);
            }
            else
            {
                imageInfo = extractType2Info(imageFile,tag, group);
                if(imageInfo!=null)
                {
                    collection.AddImage(imageInfo);
                }
            }

        }
        return collection;
    }


}


最佳答案

我的猜测是,也许您可​​能会尝试编写一些带有选项的表达式,例如:

^[A-Za-z]{1,2}(\d{4})[A-Z]?([+-]\d{2}\.?\d{2})[A-Z]?([+-][0-9]+)-([A-Za-z]+)

也许不是,我不太确定。

测试

import java.util.regex.Matcher;
import java.util.regex.Pattern;


public class re{

    public static void main(String[] args){

        final String regex = "^[A-Za-z]{1,2}(\\d{4})[A-Z]?([+-]\\d{2}\\.?\\d{2})[A-Z]?([+-][0-9]+)-([A-Za-z]+)";
        final String string = "A0001L+23.20K+01-Red.JPG\n"
             + "R0002A+10.10B+23-extL.JPG\n"
             + "RD1500-0001-1-P.JPG";

        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);

        while (matcher.find()) {
            System.out.println("Full match: " + matcher.group(0));
            for (int i = 1; i <= matcher.groupCount(); i++) {
                System.out.println("Group " + i + ": " + matcher.group(i));
            }
        }


    }
}

输出

Full match: A0001L+23.20K+01-Red
Group 1: 0001
Group 2: +23.20
Group 3: +01
Group 4: Red
Full match: R0002A+10.10B+23-extL
Group 1: 0002
Group 2: +10.10
Group 3: +23
Group 4: extL
Full match: RD1500-0001-1-P
Group 1: 1500
Group 2: -0001
Group 3: -1
Group 4: P

正则表达式电路

jex.im可视化正则表达式:

enter image description here

<小时/>

如果您想简化/修改/探索表达式,regex101.com 的右上角面板已对此进行了解释。 。如果您愿意,也可以在 this link 观看,它如何与一些示例输入相匹配。

<小时/>

关于java - 正则表达式模式与目录内的文件名不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58002703/

相关文章:

用于单独程序参数的 Java 单独日志文件

java - 如何登录不同的文件? log4j2

javascript - 为什么这个特定的正则表达式在 JavaScript 中不起作用?

Python:为什么使用 re.IGNORECASE 编译的正则表达式会删除第一个字符?

regex - 查找一个字符串并在某些字符前添加一个字符串

java - 圆内随机点方法不均匀分布

java - 使用selenium java的字体颜色

java - 具有空条目值的 Collectors.toMap 中的 NullPointerException

javascript - 在函数中使用/添加正则表达式(?)将 HTML 表导出到 Excel?

javascript - 使用 JavaScript 进行密码验证