从字符串中删除日期后,从文件名中提取字符串

时间:2018-07-20 06:20:36

标签: java regex string

我有一个要求,根据文件名,我需要调用不同的方法 文件名示例如下

  • Abc_def_20180719_ghi.txt
  • Pqr_xy_gh_20180730.txt

在这里我想在遇到datepattern后删除所有字符 所以输出应该像这样:

  • “ Abc_def”
  • “ Pqr_xy_gh”

请建议使用正则表达式进行适当的字符串操作

4 个答案:

答案 0 :(得分:1)

要过滤所有数字,可以使用:yourText.replaceAll("[0-9]","")。 但是,如果要删除.txt,请使用:yourTextAfterReplacingAll.split("\\.")

您想要的文本在yourTextAfterSplit[0]

答案 1 :(得分:0)

您可以使用以下正则表达式来检测文件名的必需部分

/.+(?=_\d{8})/

为演示起见,here。它可以检测到除下划线和并发8位数字(日期模式)之前的换行符以外的任何字符。

答案 2 :(得分:0)

验证日期至少从表面上看似乎是个好约会,可能有些过分考虑。如果您不关心10664964之类的无效日期,则可以简化此正则表达式。

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

public class DatePrefix {
    // no digits before date; year must be between 2000 and 9999
    // month from 01 to 12, day from 01 to 31
    private static Pattern beforeDate = Pattern.compile(
        "([^0-9]+)_[2-9]\\d{3}(?:0[1-9]|1[0-2])(?:0[1-9]|[1-2]\\d|3[01])");

    public static void main(String[] args) {
        for (String filename : args) {
            getPrefixBeforeDate(filename)
                .ifPresentOrElse(
                        prefix -> System.out.format("Found %s%n", prefix),
                        () -> System.out.format("Bad date: %s%n", filename));
        }
    }

    public static Optional<String> getPrefixBeforeDate(String filename) {
        Matcher matcher = beforeDate.matcher(filename);
        if (matcher.find()) {
            return Optional.of(matcher.group(1));
        }
        return Optional.empty();
    }
}

通过以下方式调用:

java DatePrefix Pq_xy_20180229.txt Abc_def_ghi_20380323_foo_1200.xml \
Hey_its_20182395.gif Foo_bar.txt

它打印:

Found Pq_xy
Found Abc_def_ghi
Bad date: Hey_its_20182395.gif
Bad date: Foo_bar.txt

如果您不在乎日期是否全部有效,则可以使用以下模式:

private static Pattern beforeDate = Pattern.compile("([^0-9]+)_\\d{8}");

答案 3 :(得分:0)

尝试以下模式:

[\w\d]+[A-Z-a-z][_]

您可以测试的是online

enter image description here