PatternSyntaxException - PullRequest
       8

PatternSyntaxException

5 голосов
/ 08 февраля 2012

После строки вызывает PatternSyntaxException:

Pattern.compile("*\\.*");

Я хочу создать шаблон, чтобы можно было фильтровать все файлы с именем в следующей форме: "*.*"

Какя могу это сделать?

Ответы [ 6 ]

3 голосов
/ 08 февраля 2012

Чтобы сопоставить все строки с . в имени, вы должны:

Pattern.compile(".*[.].*");

Чтобы разбить его:

  • .* соответствует любому числу произвольныхсимвол
  • [.] соответствует точке.(да, \\. тоже работает)
  • .* соответствует любому числу произвольных символов

Демонстрация:

Pattern p = Pattern.compile(".*[.].*");

System.out.println(p.matcher("hello.txt").matches()); // true
System.out.println(p.matcher("hellotxt").matches());  // false

Обратите внимание, что строка с простоодна точка, "." также соответствует.Чтобы убедиться, что у вас есть несколько символов перед и после точки, вы можете изменить * на +: .+[.].+.


Причина, по которой вы получаете PatternSyntaxException:

Оператор * следует интерпретировать как «предыдущий символ повторяется ноль или более раз».Так как вы начали свое выражение с *, не было символов для повторения, поэтому возникло исключение.

1 голос
/ 08 февраля 2012

Символ * имеет другое значение в регулярных выражениях, чем при использовании в командной строке в качестве подстановочного знака файла. Дополнительную информацию о синтаксисе регулярных выражений Java Pattern можно найти здесь: http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html

Это найдет текст, который вы хотите соответствовать:

Pattern.compile(".*\\..*");
0 голосов
/ 08 февраля 2012

Pattern.compile(".*\\/.*\\..*"); используйте этот шаблон. Он будет соответствовать всем именам файлов, которые содержат точку.Звездочка - это специальный символ.Это означает, что символ перед * может быть 0 или более раз.Таким образом, вы не можете написать это без символа раньше.Например, для имени файла шаблон C:/folder.1/folder.2/file.txt будет работать так:
.* - C:/folder.1/folder.2 (все, пока не найдется последний / символ)
\/ - / символ
.* - file (все, пока не найдется последний . символ (точка))
\\. - . (точка)
.* - txt (все после . (собственно расширение файла))

0 голосов
/ 08 февраля 2012

Если вы имеете в виду, вы хотите отфильтровать файлы с точкой "."используйте его имя:

Pattern.compile("[^\\.]*\\.[^\\.]*")
0 голосов
/ 08 февраля 2012

Вы должны написать:

Pattern.compile("\\*\\.\\*");

Поскольку * имеет специальное значение (ноль или более) в регулярном выражении.Таким образом, вы должны экранировать его с помощью \\.

Другим способом может быть:

Pattern.compile("[*][.][*]");

, потому что * теряет свое другое значение, когда оно появляется между [ и ].

Если вы хотите проанализировать имя файла в формате *.*, этого должно быть достаточно:

Pattern.compile(".+\\..+");

Чтобы соответствовать любому имени файла (которое может иметь или не иметь расширение), выможно использовать

Pattern.compile(".+(\\..+)?");
0 голосов
/ 08 февраля 2012

Может быть, вы имели в виду:

Pattern.compile("\\*\\.\\*");

Если нет, а звездочка означает «любой символ», то

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