Regex для перехвата всех файлов, кроме тех, которые начинаются с "." - PullRequest
7 голосов
/ 26 мая 2010

В каталоге со смешанным содержимым, например:

.afile
.anotherfile
bfile.file
bnotherfile.file
.afolder/
.anotherfolder/
bfolder/
bnotherfolder/

Как бы вы поймали все , но файлы (не каталоги), начиная с .?
Я пробовал с негативным прогнозом ^(?!\.).+?, но, похоже, он не работает правильно.
Обратите внимание, что я хотел бы избежать этого, исключив . с помощью [a-zA-Z< plus all other possible chars minus the dot >]

Есть предложения?

Ответы [ 4 ]

18 голосов
/ 26 мая 2010

Это должно сделать это:

^[^.].*$

[^abc] будет соответствовать всему, что не a, b или c

1 голос
/ 26 мая 2010

Отрицательный взгляд ^(?!\.).+$ работает. Вот это на Java:

    String[] files = {
        ".afile",
        ".anotherfile",
        "bfile.file",
        "bnotherfile.file",
        ".afolder/",
        ".anotherfolder/",
        "bfolder/",
        "bnotherfolder/",
        "", 
    };
    for (String file : files) {
        System.out.printf("%-18s %6b%6b%n", file,
            file.matches("^(?!\\.).+$"),
            !file.startsWith(".")
        );
    }

Вывод ( как видно на ideone.com ):

.afile              false false
.anotherfile        false false
bfile.file           true  true
bnotherfile.file     true  true
.afolder/           false false
.anotherfolder/     false false
bfolder/             true  true
bnotherfolder/       true  true
                    false  true

Обратите внимание также на использование не-регулярного выражения String.startsWith. Возможно, это лучшее, наиболее читаемое решение, поскольку регулярное выражение в любом случае не требуется, а startsWith равно O(1), где в качестве регулярного выражения (по крайней мере, в Java) используется значение O(N).

Обратите внимание на несогласие в пустой строке. Если это возможный ввод и вы хотите, чтобы он возвращал false, вы можете написать что-то вроде этого:

!file.isEmpty() && !file.startsWith(".")

Смотри также

1 голос
/ 26 мая 2010

Экранирование . и отрицание символов, которые могут начинать имеющееся у вас имя:

^[^\.].*$

Успешно протестировано с вашими тестами здесь .

0 голосов
/ 26 мая 2010

Хм ... как насчет класса отрицательных символов?

[^.]

чтобы исключить точку?

...