Вы можете использовать следующее регулярное выражение для достижения своей цели:
^[\w-]+\d{2}-\d{2}-\d{4}\.txt(?:\.gz)?$
Объяснение приведенного выше регулярного выражения: ]
^,$
- соответствует началу и концу тестовой строки, соответственно.
[\w-]+
- один или несколько раз соответствует символу слова и дефису.
\d{}
- соответствует количеству цифр, указанному в фигурных скобках.
(?:\.gz)?
- представляет собой сопоставление групп без захвата .gz
ноль или один раз из-за? квантификатор . Вы могли бы использовать чередование |
(или, как вы ожидали, ИЛИ ), но это также разборчиво и более эффективно.
Вы можете найти демонстрацию вышеуказанного регулярного выражения здесь.
IMPLEMENTATION IN JAVA:
import java.util.regex.*;
public class Main
{
private static final Pattern pattern = Pattern.compile("^[\\w-]+\\d{2}-\\d{2}-\\d{4}\\.txt(?:\\.gz)?$", Pattern.MULTILINE);
public static void main(String[] args) {
String testString = "abcd_04-04-2020.txt\nabcd_04-04-2020.txt.gz\nsomethibsnfkns_05-06-2020.txt\n.txt.gz";
Matcher matcher = pattern.matcher(testString);
while(matcher.find()){
System.out.println(matcher.group(0));
}
}
}
You can find the implementation of the above regex in java in здесь.
ПРИМЕЧАНИЕ: Если хотите также соответствовать действительным датам; пожалуйста, посетите здесь.