gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:28:47 27 4
gpt4 key购买 nike

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

问题是由于某种原因正则表达式模式与文件名不匹配,我已经使用此链接 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com