2014-09-12 2 views
2

Я пытаюсь определить, содержит ли строка любые символы, не входящие в набор с использованием регулярных выражений в Java.Регулярное выражение для строки содержит символы не в определенном наборе

У меня есть следующий набор допустимых символов «@ ADEFIKRVXY156». Символы пробела можно игнорировать и считать действительными.

Ввод будет строкой, представляющей собой ряд буквенно-цифровых символов или пробелов. Регулярное выражение, которое я хотел бы написать, должно было бы вернуть Java Pattern.matcher (String) true, если введенная строка содержит любые символы, которые не соответствуют моему действительному набору. Если строка имеет некоторые допустимые и некоторые недопустимые символы, вся строка должна быть оценена как недействительная. Единственный случай для достоверности - вся строка содержит символы только в действительном наборе. Теперь каждый символ должен быть оценен в строке против набора допустимых символов, а не для соответствия строк или соответствия шаблону.

ввода образца, который действителен (Java Pattern.matcher должен возвращать ложь): "@", "F", "FI", "RI"

Sample вход, который не является допустимым (Java Pattern.matcher должен вернуть истинный): "4 I", "FT", "4 в"

Спасибо за помощь

+0

Вот отличный инструмент для проверки ваших регулярных выражений: http://www.regexr.com/ – Schlaus

ответ

2

Это позволяет один или несколько символов, которые присутствуют внутри класса символов,

[@ADEFIKRVXY156\\s]+ 

Код:

String[] valid = { "@", " F", " F I", "R I" }; 
String[] notValid = { " 4 I", " FT", " 4 B" }; 
String pattern = "[@ADEFIKRVXY156\\s]+"; 
for (String s : valid) 
    System.out.println(!s.matches(pattern)); 
for (String s : notValid) 
    System.out.println(!s.matches(pattern)); 
+0

Вам нужно добавить якоря^и $ в начало и конец соответственно, чтобы убедиться, что вход состоит только из этих символов: Метод '/^[@ ADEFIKRVXY156] + $ /' – Schlaus

+3

не требует привязок. –

+0

вы не можете указать пробел с буквальным пробелом, вам нужно будет использовать экранированную последовательность, такую ​​как \\ s – vreddy

4

Попробуйте [@ADEFIKRVXY156\\s]*, если пустая строка действительна (+ вместо * в противном случае).

String[] valid = { "@", " F", " F I", "R I" }; 
String[] notValid = { " 4 I", " FT", " 4 B" }; 
String pattern = "[@ADEFIKRVXY156\\s]*"; 
for (String s : valid) 
    System.out.println(!s.matches(pattern)); 
for (String s : notValid) 
    System.out.println(!s.matches(pattern)); 

Выход:

false 
false 
false 
false 
true 
true 
true 
0

Если ваша цель состоит в том, что (Java Pattern.matcher должна возвращать истину), когда является недействительной, и вы не собираетесь использовать значение матча вы должны использовать отрицание класса символов структура [^

Здесь у вас есть регулярное выражение:

.*[^@ADEFIKRVXY156\s] 

DEMO

Он вернет true, когда регулярное выражение найдет первый символ, который не находится в вашем диапазоне.

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