2013-11-23 3 views
2
if("test%[email protected]*)$(%".matches("[^a-zA-Z\\.]")) 
    System.exit(0); 

if("te/st.txt".matches("[^a-zA-Z\\.]")) 
    System.exit(0); 

Программа не выходит, хотя регулярные выражения должны возвращаться true. Что не так с кодом?Почему String.matches возвращает false в Java?

+2

Если вы думаете, что это должно быть верно, ваше регулярное выражение не делает то, что вы думаете, что оно делает. Расскажите, пожалуйста, что вы думаете, что это должно делать, мы можем сказать вам, где вы поступили неправильно. – Dukeling

+0

Другое дикое предположение здесь. Но вы имеете в виду использовать '^' для обозначения начала линии? Если так, вы делаете это неправильно. – Sanchit

+0

когда-либо пытался 'if (matcher.find() == true) return matcher.group (0);' –

ответ

6

matches возвращает true только в том случае, если целая строка соответствует регулярному выражению. В вашем случае ваше регулярное выражение представляет только один символ, который не является a-z, A-Z или ..

Я подозреваю, что вы хотите проверить, содержит ли строка один из этих специальных символов, который вы описали в регулярном выражении. В этом случае окружайте ваше регулярное выражение с помощью .*, чтобы регулярное выражение соответствовало всей строке. О, и вам не нужно бежать . внутри класса персонажа [.].

if ("test%[email protected]*)$(%".matches(".*[^a-zA-Z.].*")) { 
    //string contains character that is not in rage a-z, A-Z, or '.' 
0

Вы получаете всегда ложно, так как метод matches() возвращает истину только тогда, когда шаблон совпадает полную строку.

4

x.matches(y) эквивалентно

Pattern.compile(y).matcher(x).matches() 

и требует всю строку x, чтобы соответствовать регулярному выражению y. Если вы просто хотите знать, если есть некоторые подстроки из x, что соответствует y, то вам нужно использовать find() вместо matches():

if(Pattern.compile("[^a-zA-Z.]").matcher("test%[email protected]*)$(%").find()) 
    System.exit(0); 

В качестве альтернативы вы можете полностью изменить смысл теста:

if(!"test%[email protected]*)$(%".matches("[a-zA-Z.]*")) 

, предоставляя шаблон, который соответствует строкам, которые разрешены, а не символы, которые не являются, а затем выясняет, не сработала ли тестовая строка , чтобы соответствовать этому шаблону р-н.

+0

Точная, лаконичная и полная. Хорошая работа. +1 – ridgerunner

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