считать файлы с регулярным выражением в Java - PullRequest
0 голосов
/ 25 ноября 2018

Я хочу считать файлы с помощью регулярных выражений, чтобы соответствовать именам файлов. Но мое регулярное выражение не совпадало.В моем "F: \" есть два файла с именами "a (1) .txt" и "a (1) (1) .txt". Но регулярное выражение может соответствовать только одному из них, количество равно 1. Но когда я изменяю "() "to" - "в моих регулярных выражениях и именах файлов. Это может соответствовать всем им. Я думаю, что проблема в моем регулярном выражении. Но я не знаю почему?вот мой код:

public static void main(String[] args) {
    File dest = new File("F:\\");
    File file = new File("E:\\a(1).txt");
    move(file, dest);
}

public static void move(File file, File dest) {
    //get file name
    String name = file.getName();
    int index = name.lastIndexOf(".");
    String realname = name.substring(0, index);
    String suffix = name.substring(index + 1, name.length());
    //get files in F:\
    File[] fs = dest.listFiles(new FileFilter() {
        @Override
        public boolean accept(File pathname) {
            //get File name
            String fname = pathname.getName();
            return fname.equals(name) || fname.matches(realname + "\\(\\d+\\)." + suffix);
        }
    });
    int count = fs.length;
    System.out.println(count);
    file.renameTo(new File(dest + realname + (count == 0 ? "." : "(" + count + ").") + suffix);
}

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Вы должны научиться отладке с IDE или хотя бы печатать значения на контрольной точке суммы, чтобы сузить источник проблемы.

Ваш шаблон для fname.matches() равен a(1)\(\d+\).txt.Круглые скобки - это специальные символы в регулярных выражениях, чтобы избежать их, вы можете использовать java.util.regex.Pattern.quote(realname).Это изменит шаблон на a\(1\)\(\d+\).txt.

Мысли:
input file = a(2).txt для соответствия a(2).txt и a(2)(1).txt, вы можете удалить fname.equals(name) и изменить регулярное выражение на fname.matches(Pattern.quote(realname) + "(\\(\\d+\\))*\\." + suffix).* означает ноль или более раз в круглых скобках;""- точка является специальным символом и должна быть экранирована.

0 голосов
/ 25 ноября 2018

Я думаю, что ваше регулярное выражение должно быть

(\(\d+\))+\.

Вам также нужно экранировать специальный символ, чтобы использовать это регулярное выражение в коде Java следующим образом:

(\\(\\d+\\))+\\.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...