将文件名分组

时间:2019-11-27 09:59:54

标签: java regex

输入:

  

“ MyPrefix_CH-DE_ProductName.pdf”

所需的输出:

  

[“ MyPrefix”,“ CH”,“ DE”,“ ProductName”]

CH是国家/地区代码,它应来自预定义的列表,例如。 ["CH", "IT", "FR", "GB"]

编辑:前缀也可以包含_和-,但不能包含CH或DE。

DE是一种语言代码,它应来自预定义的列表,例如。 ["EN", "IT", "FR", "DE"]

我该怎么做?

我正在这里寻找基于正则表达式的解决方案。

6 个答案:

答案 0 :(得分:3)

我假设扩展名始终为pdf

String str = "MyPref_ix__CH-DE_ProductName.pdf";

String regex = "(.*)_(CH|IT|FR|GB)-(EN|IT|FR|DE)_(.*)\\.pdf";
Pattern pattern = Pattern.compile(regex);

Matcher matcher = pattern.matcher(str);
String[] res = new String[4];

if(matcher.matches()) {
    res[0] = matcher.group(1);
    res[1] = matcher.group(2);
    res[2] = matcher.group(3);
    res[3] = matcher.group(4);
}

答案 1 :(得分:0)

您可以使用String.split两次,因此可以先用'_'分割以获取CH-DE字符串,然后再用'-'分割以获取CountryCode和LanguageCode。

编辑后更新,输入内容包含“ _”和“-”:

以下代码扫描输入的String以查找匹配的国家/地区。我将输入更改为“ My-Pre_fix_CH-DE_ProductName.pdf”

检查以下代码:

 public static void main(String[] args) {
        String [] countries = {"CH", "IT", "FR", "GB"};
        String input = "My-Pre_fix_CH-DE_ProductName.pdf";
        //First scan to find country position
        int index = -1;
        for (int i=0; i<input.length()-4; i++){
            for (String country:countries){
                String match = "_" + country + "-";
                String toMatch = input.substring(i, match.length()+i);
                if (match.equals(toMatch)){
                    //Found index
                    index=i;
                    break;
                }
            }
        }
        String prefix = input.substring(0,index);
        String remaining = input.substring(index+1);//remaining is CH-DE_ProductName.pdf
        String [] countryLanguageProductCode = remaining.split("_");
        String country = countryLanguageProductCode[0].split("-")[0];
        String language = countryLanguageProductCode[0].split("-")[1];
        String productName = countryLanguageProductCode[1].split("\\.")[0];
        System.out.println("[\"" + prefix +"\", \"" + country + "\", \"" + language +"\", \"" + productName+"\"]");

    }

它输出:

["My-Pre_fix", "CH", "DE", "ProductName"]

答案 2 :(得分:0)

您可以尝试以下

payment_days

答案 3 :(得分:0)

此代码进行拆分,并使用返回的结果(更多OOP)创建对象。

package com.local;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/**
 * Hello world!
 *
 */
public class App 
{
    public static void main( String[] args )
    {
        List<String> countries = Arrays.asList("CH", "IT", "FR", "GB");
        List<String> languages  = Arrays.asList("EN", "IT", "FR", "DE");
        String filename = "MyPrefix_CH-DE_ProductName.pdf";
        //Remove prefix
        filename = filename.split("\\.")[0];
        List<String> result = Arrays.asList(filename.split("[_\\-]"));

        FileNameSplitResult resultOne = new FileNameSplitResult(result.get(0), result.get(1), result.get(2), result.get(3));

        System.out.println(resultOne);
    }

    static class FileNameSplitResult{
        String prefix;
        String country;
        String language;
        String productName;

        public FileNameSplitResult(String prefix, String country, String language, String productName) {
            this.prefix = prefix;
            this.country = country;
            this.language = language;
            this.productName = productName;
        }

        @Override
        public String toString() {
            return "FileNameSplitResult{" +
                    "prefix='" + prefix + '\'' +
                    ", country='" + country + '\'' +
                    ", language='" + language + '\'' +
                    ", productName='" + productName + '\'' +
                    '}';
        }
    }
}

执行结果:

FileNameSplitResult{prefix='MyPrefix', country='CH', language='DE', productName='ProductName'}

答案 4 :(得分:0)

您可以使用以下正则表达式:

^(.*?)_(CH|IT|FR|GB)-(EN|IT|FR|DE)_(.*)$

Java代码:

Pattern p = Pattern.compile("^(.*?)_(CH|IT|FR|GB)-(EN|IT|FR|DE)_(.*)$");
Matcher m = p.matcher(input);
if (m.matches()) {
    String[] result = { m.group(1), m.group(2), m.group(3), m.group(4) };
}

您可以try it here

请注意,如果前缀可以包含像_CH-EN_这样的子字符串,它仍然会失败,而且我认为除了清理输入内容外,没有其他事情可以解决。

答案 5 :(得分:0)

另一种选择,与@billal GHILAS和@Aaron答案几乎相同,但使用命名组。对于自己或其他在查看我的代码后立即看到我的正则表达式会做什么的人,我觉得它很方便。命名的组使其更容易。

String str = "My_Prefix_CH-DE_ProductName.pdf";
Pattern filePattern = Pattern.compile("(?<prefix>\\w+)_"
                                      + "(?<country>CH|IT|FR|GB)-" 
                                      + "(?<language>EN|IT|FR|DE)_" 
                                      + "(?<product>\\w+)\\.");
Matcher file = filePattern.matcher(str);
file.find();
System.out.println("Prefix: " + file.group("prefix"));
System.out.println("Country: " + file.group("country"));
System.out.println("Language: " + file.group("language"));
System.out.println("Product: " + file.group("product"));