2010-02-12 4 views

ответ

2

Если не удается, потому что матчи сопоставляет полную строку, ваше регулярное выражение соответствует 1 символ, который не является в характере диапазоны вы перечисляете, если вы смените:

assertTrue(Pattern.compile("[^a-zA-Z0-9]").matcher("abc;").find()); 

он должен утверждать, правда.

+0

Он будет утверждать true, сопоставляя ''; "', но я подозреваю, что это не то, что имел в виду ОП. – finnw

+0

Да, вот что я имею в виду. Что делать, если я использую Pattern.matches (". * [^ A-zA-Z0-9]. *", "Abc;")? Это то же самое? – jackysee

+0

@jackysee. Это приведет к такому же поведению. Разница заключается в том, что между поиском не буквенно-цифровой и проверкой того, что строка имеет формат «ничего», «не буквенно-цифровой» «ничего», что не совсем то же самое. Используя find, вы можете искать следующий не-альфа-символ в своей строке, используя совпадения, которые вы не можете сделать, например. – rsp

3

Поскольку метод .matches() пытается сопоставить всю строку, и ваше регулярное выражение не совпадает со всей строкой, только точка с запятой. Метод Matcher.find() будет работать (в этом случае: найдите символ, который не является буквой между a и z, а не числом от 0 до 9. Конечно, он также найдет á, ö и т. Д.)

Что это такое вы действительно хотите это сделать?

1

Поскольку Pattern.matches()is equivalent to соответствующий шаблон составляется и подается в Matcher.matches(), которые, as specified, проверяет, если все входные соответствует шаблону. Если вы хотите только совместить часть ввода, вместо этого вы должны использовать Matcher.find().

0

попробовать "^ [A-Za-Z0-9]" как образец

+0

Я считаю, что ОП пытается сопоставить ';' в целевой строке. Так что это не правило регулярное, это неправильно, он использует 'matches()' вместо 'find()', как указывали другие. В любом случае «попробуйте это вместо» не является особенно полезным ответом. –

Смежные вопросы