2014-10-06 4 views
-2

Я хочу разрешить буквенные числовые значения и только несколько специальных символов в моей строке.Java regex pattern не работает как указано

регулярное выражение [a-zA-Z0-9[@#%&\\s]]

Когда я попытался с Matcher.find(), он говорит, правда, даже если я использовал другие специальные символы в строке. Пример: welcome123^456. Он должен быть ложным (несоответствующим).

Когда я использовал String.matches(), он говорит false, даже для правильного шаблона. Пример: [email protected]. Предполагалось, что это произойдет. Но я становлюсь ложным.

Ниже приведены только 5 специальных символов, которые я хочу разрешить вместе с цифрами Alpha +. @ #% $ &

Для Ex: welcome123 # - должен получить истинные
welcome123 $ - должно получить истинную
welcome123_ - должно получить ложные (., Потому что подчеркивание не допускается)
приветственного $ @ - должно получить истинное
1234 $ @ - должен получить истинный

+0

Что такое «несколько специальных символов», которые вы упоминаете? Включают ли они открытые и закрытые квадратные скобки ('' и '' ')? – Edd

+1

Для начала. Вы ищете только 1 символ/цифру/символ. Таким образом, match() терпит неудачу. используйте '[a-zA-Z0-9 [@ #% & \ s]] +" '. Кроме того, почему 2' ['s? – TheLostMind

+1

Пожалуйста, покажите нам пример того, что вы пробовали, в коде. –

ответ

1

Я думаю, что проблема заключается в использовании вложенных квадратных скобок, что дает вам класс символов объединения (см. docs). То есть [a-zA-Z0-9[@#%&\s]] соответствует либо a String с буквенно-цифровыми символами верхнего и нижнего регистра, или a String, содержащим только специальные символы.

Ваш шаблон также соответствует одному символу определенного класса - вам нужно использовать что-то вроде + для соответствия строкам длиной более одного символа.

Если вы хотите включить квадратные скобки в ваших разрешенных символов вы должны их избежать, или, если нет, то вы не должны вкладывать ваши символьные классы

"[email protected]".matches("[[email protected]#%&\\s\\[\\]]+") //true 
"welcome123^456".matches("[[email protected]#%&\\s\\[\\]]+") //false 
"[email protected]".matches("[[email protected]#%&\\s]+") //true 
"welcome123^456".matches("[[email protected]#%&\\s]+") //false 
"welcomeAA123[@]".matches("[[email protected]#%&\\s\\[\\]]+") //true 
"welcomeAA123[@]".matches("[[email protected]#%&\\s]+") //false 
+0

Thanks Edd. .. Ваше предложение работает. – Subbu

0

Вы упускаете квантор и якоря:

^[a-zA-Z0-9[@#%&\\s\\]]+$ 

Также: match возвращает true, если вся строка соответствует заданному шаблону. find пытается найти подстроку, которая соответствует шаблону.