Java регулярное выражение для фильтрации файлов - PullRequest
1 голос
/ 15 декабря 2008

Я хотел бы построить регулярное выражение в Java, которое будет передано в FilenameFilter для фильтрации файлов в каталоге.

Проблема в том, что я не могу освоить регулярное выражение "модель ума":)

Это регулярное выражение, с которым я пришел, чтобы выбрать файлы, которые я хотел бы исключить

((ABC | XYZ)) + \ ш * test.xml

Я хотел бы выбрать все файлы, которые заканчиваются на Test.xml, но не начинаются с ABC или XYZ.

Не могли бы вы добавить любые ресурсы, которые могли бы помочь мне в моей битве с регулярными выражениями.

Спасибо

Следующий ресурс объясняет много вещей о регулярном выражении регулярные выражения.info

Ответы [ 5 ]

9 голосов
/ 15 декабря 2008

Это проще, быстрее и удобочитаемее без регулярных выражений.

if (str.endsWith("Test.xml") && !str.startsWith("ABC"))
4 голосов
/ 15 декабря 2008

Что я хотел бы сделать, это выбрать все файлы, которые заканчиваются на Test.xml но не начинайте с ABC или XYZ.

Либо вы сопоставляете все свои файлы с этим регулярным выражением:

^(?:(?:...)(?<!ABC|XYZ).*?)?Test\.xml$

или вы делаете обратное и берете каждый файл, который не соответствует:

^(?:ABC|XYZ).*?Test\.xml$

Лично я нахожу второй вариант намного проще.

ABC_foo_Test.xml   // #2 matches
XYZ_foo_Test.xml   // #2 matches
ABCTest.xml        // #2 matches 
XYZTest.xml        // #2 matches
DEF_foo_Test.xml   // #1 matches
DEFTest.xml        // #1 matches
Test.xml           // #1 matches
1 голос
/ 15 декабря 2008

Регулярные выражения, предоставляемые Tomalak и VonC, более сложны, чем они должны быть. Поместить отрицательный взгляд в начало регулярного выражения гораздо понятнее, чем сопоставить три символа и сделать отрицательный взгляд позади. И если вы используете метод matches(), вам даже не нужно использовать якоря (^, $, \z).

public boolean accept(File dir, String name) {
    return name.matches("(?!ABC|XYZ).*Test\\.xml");
}
1 голос
/ 15 декабря 2008

Просто для удовольствия от регулярного выражения:

(?ms)^([^\r\n]{3}(?<!ABC|XYZ)[^\r\n]*?)?Test\.xml$

Даже если это не самое удобочитаемое решение, оно должно работать, и вам не придется определять собственный фильтр файлов.

(?<!ABC|XYZ) - это выражение для поиска, которое избегает любого четвертого символа (после первых трех символов) перед тем, чего вы хотите избежать.

0 голосов
/ 15 декабря 2008

Это выберет файлы, которые не начинаются с A, B, C, X, Y или Z и заканчиваются в Test.xml:

"[^ ABCXYZ]. * Тест \\. \\ XML г"

  • [^ ABCXYZ]: любой символ, не входящий в набор A, B, C, X, Y, Z.
  • . *: Любой символ, ноль или более раз
  • Тест: точный текст "Тест"
  • \\ .: Точечный символ (необходимо экранировать, используя обратную косую черту, и, если вы находитесь в строке, этот обратный слэш должен быть экранирован ... обратной косой чертой!)
  • xml: точный текст "xml"
  • \\ z: конец ввода
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...