Почему регулярное выражение Java ". * [Two]. *" Соответствует "[one]"? - PullRequest
3 голосов
/ 15 сентября 2011

Почему String.matches возвращает true, когда два значения заключены в [] скобки?

System.out.println("[one]".matches("(?i).*" + "[two]" + ".*"));
   //Why does it return true? Shouldn't "[]" be treated as value?
System.out.println("one".matches("(?i).*" + "two" + ".*"));//OK - prints false

System.out.println("[one]".equals("[two]"));//OK - prints false
System.out.println("one".equals("two"));//OK - prints false

Ответы [ 4 ]

9 голосов
/ 15 сентября 2011

Beacuase [two] соответствует одной из букв t, w или o, которая находится в строке "[one]"

6 голосов
/ 15 сентября 2011
System.out.println("[one]".matches("(?i).*[two].*"));

печатает true, поскольку o класса [two] соответствует o в one Следующие .* совпадения ne - Вуаля, успешное совпадение!

В регулярном выражении [abc] означает «один из символов a, b или c».

System.out.println("[one]".matches("(?i).*\\[two].*"));

напечатает false, потому что теперь скобки обрабатываются буквально. Хотя это регулярное выражение не имеет большого смысла.

1 голос
/ 15 сентября 2011

[two] соответствует одной из букв в квадратных скобках, т. Е. 't', 'w', and 'o'
Чтобы соответствовать квадратным скобкам, вам необходимо экранировать ее как \[two\]

1 голос
/ 15 сентября 2011
Regex:  .*     [two]     .*
Match:  "["     "o"    "ne]"

Квадратные скобки должны быть в кавычках.

Попробуйте вместо "[one]".matches("(?i).*" + Pattern.quote("[two]") + ".*").

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