正则表达式文件名正好有2个下划线

时间:2015-08-20 15:27:04

标签: java regex

如果文件名只有2个下划线和扩展名' txt',我需要匹配。 例如:

asdf_assss_eee.txt    ->  true
asdf_assss_eee_txt    ->  false
asdf_assss_.txt       ->  false

private static final String FILENAME_PATTERN = "/^[A-Za-z0-9]+_[A-Za-z0-9]+_[A- Za-z0-9]\\.txt"; 

不起作用。

4 个答案:

答案 0 :(得分:0)

您只需要在第三个char类之后添加+,并且必须删除第一个正斜杠。

private static final String FILENAME_PATTERN = "^[A-Za-z0-9]+_[A-Za-z0-9]+_[A-Za-z0-9]+\\.txt$"; 

答案 1 :(得分:0)

您可以使用不敏感标记这样的正则表达式:

[a-z\d]+_[a-z\d]+_[a-z\d]+\.txt

或使用内联不敏感标记

(?i)[a-z\d]+_[a-z\d]+_[a-z\d]+\.txt

<强> Working demo

如果您想稍微缩短一下,可以这样做:

([a-z\d]+_){2}[a-z\d]+\.txt

答案 2 :(得分:0)

更新

因此,假设您希望在文件扩展名之前的第二个下划线后面至少有一个或多个字符。

仍然没有“需要”正则表达式。您可以通过下划线拆分String,并且您应该从拆分中获得3个元素。如果第3个元素只是“.txt”,则它无效。

示例:

public static void main(String[] args) throws Exception {
    String[] data = new String[] {
        "asdf_assss_eee.txt",
        "asdf_assss_eee_txt",
        "asdf_assss_.txt"
    };

    for (String d : data) {
        System.out.println(validate(d));
    }
}

public static boolean validate(String str) {
    if (!str.endsWith(".txt")) {
        return false;
    }

    String[] pieces = str.split("_");
    return pieces.length == 3 && !pieces[2].equalsIgnoreCase(".txt");
}

结果:

true
false
false

旧答案

不确定我理解为什么你的第三个例子是假的,但这可以很容易地在没有正则表达式的情况下完成。

首先检查字符串是否以“.txt”结尾,然后检查它是否只包含两个下划线。

示例:

public static void main(String[] args) throws Exception {
    String[] data = new String[] {
        "asdf_assss_eee.txt",
        "asdf_assss_eee_txt",
        "asdf_assss_.txt"
    };

    for (String d : data) {
        System.out.println(validate(d));
    }
}

public static boolean validate(String str) {
    if (!str.endsWith(".txt")) {
        return false;
    }

    return str.chars().filter(c -> c == '_').count() == 2;
}

结果:

true
false
true

答案 3 :(得分:0)

使用此模式:

select /*+ monitor */ salary,month from salary
/

并在匹配器中使用Pattern p = Pattern.compile("_[^_]+_[^_]+\\.txt") 代替.find()

.match()