Почему это регулярное выражение не работает, как ожидалось в Java? - PullRequest
9 голосов
/ 25 января 2011

тривиальный вопрос регулярных выражений (ответ, скорее всего, специфичен для Java):

"#This is a comment in a file".matches("^#")

Это возвращает ложь. Насколько я понимаю, ^ означает, что это всегда означает, а # не имеет особого значения, поэтому я бы перевел ^# как "A '#' в начале строки". Который должен совпадать. И так в Perl:

perl -e "print '#This is a comment'=~/^#/;"

печатает "1". Так что я уверен, что ответ на этот вопрос специфичен для Java. Кто-нибудь, пожалуйста, просветите меня?

Спасибо.

Ответы [ 3 ]

17 голосов
/ 25 января 2011

Matcher.matches() проверяет, соответствует ли регулярное выражение всей входной строке .

Поскольку ваше регулярное выражение соответствует только самому первому символу, возвращается false.

Вместо этого вы захотите использовать Matcher.find().

Конечно, найти конкретную спецификацию может быть немного сложно, но она есть:

  • String.matches() определяется как то же, что и Pattern.matches(regex, str).
  • Pattern.matches() в свою очередь определяется как Pattern.compile(regex).matcher(input).matches().
  • Matcher.matches() задокументировано так (выделено мной):

    Попытки сопоставить всю область с шаблоном.

2 голосов
/ 25 января 2011

Метод matches сопоставляет ваше регулярное выражение с всей строкой.

Поэтому попробуйте добавить .*, чтобы соответствовать остальной части строки.

"#This is a comment in a file".matches("^#.*")

, который возвращает true. Можно даже удалить все якоря (как начало, так и конец) из регулярного выражения, а метод match добавит его для нас. Таким образом, в приведенном выше случае мы могли бы также использовать "#.*" в качестве регулярного выражения.

0 голосов
/ 25 января 2011

Это должно соответствовать вашим ожиданиям:

"#This is a comment in a file".matches("^#.*$")

Теперь входная строка соответствует шаблону "Первый символ должен быть #, остальные должны быть любым символом"


После комментария Иоахима следующее эквивалентно:

"#This is a comment in a file".matches("#.*")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...