2013-08-05 2 views
27

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

Мой код:

//pattern to find if there is any special character in string 
    Pattern regex = Pattern.compile("[$&+,:;[email protected]#|'<>.-^*()%!]"); 
    //matcher to find if there is any special character in string 
    Matcher matcher = regex.matcher(searchQuery.getSearchFor()); 

    if(matcher.find()) 
    { 
     errors.rejectValue("searchFor", "wrong_pattern.SearchQuery.searchForSpecialCharacters","Special characters are not allowed!"); 
    } 
+3

прочерк в '[]' должны быть экранированы, он имеет особое значение там. – MightyPork

+6

** ¿¡** Итак, вы считаете, что единственные специальные символы, которые существуют, - это те, что на вашей клавиатуре **!? ** :-) – xanatos

+2

Точно. Было бы лучше определить все «неспецифические» характеристики и сделать это отрицательным. – NeplatnyUdaj

ответ

84

Пожалуйста, не делай этого ... немного Unicode BABY ANGEL s как этот умирают! ◕◡◕ (← это не изображения) (ни стрела!)

☺ И вы убиваете 20 лет DOS :-) (последний смайлик называется WHITE SMILING FACE ... Теперь на 263A. .. Но в древние времена это было ALT-1)

и его друг

BLACK SMILING FACE ... Теперь на 263b ... Но в древние времена это было ALT-2

Попробуйте использовать отрицательный результат:

Pattern regex = Pattern.compile("[^A-Za-z0-9]"); 

(это будет только стандартные буквы «A-Z» и «стандартные» цифры.

+3

Будет ли это работать для неанглийских персонажей? например, Ã 蔿 –

+2

@AbdullahShoaib Ясно не :) Вам нужно будет сделать полный список того, что вы считаете «особенным» и/или тем, что считаете «хорошим». – xanatos

+0

Я заметил, что многие люди используют '[A-Za-z0-9]' для представления любой буквы или цифры, как строчной, так и верхней, но не лучше ли просто '[0-z]'? –

13

У вас есть тир в середине символа класса, который будет означать диапазон символов. Положите тире в конце класса, как так:

[$&+,:;[email protected]#|'<>.^*()%!-] 
6

, так как у вас нет пробельных и подчеркнуть в своем классе символов я думаю следующее регулярное выражение будет лучше для вас:

Pattern regex = Pattern.compile("[^\w\s]"); 

Это значит соответствовать все, кроме [A-Za-z0-9\s_] версии

Unicode:

Pattern regex = Pattern.compile("[^\p{L}\d\s_]"); 
13

Это потому, что ваш шаблон содержит .-^, который все символы между и в том числе . и ^, которые включены цифры и некоторые другие символы, как показано ниже:

enter image description here

Если с помощью специальных символов, вы имеете в виду знаки препинания и символы используют:

[\p{P}\p{S}] 

который содержит все Юникода пунктуации и символы.

3
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class detectspecial{ 
public int getSpecialCharacterCount(String s) { 
    if (s == null || s.trim().isEmpty()) { 
     System.out.println("Incorrect format of string"); 
     return 0; 
    } 
    Pattern p = Pattern.compile("[^A-Za-z0-9]"); 
    Matcher m = p.matcher(s); 
    // boolean b = m.matches(); 
    boolean b = m.find(); 
    if (b == true) 
     System.out.println("There is a special character in my string "); 
    else 
     System.out.println("There is no special char."); 
    return 0; 
} 
} 
+0

этот код всегда return 0 –

2

Если вы используете только символы ASCII, вы можете положиться на использование шестигранных диапазонов в таблице ASCII. Вот регулярное выражение, которое будет захватывать все специальные символы в диапазоне 33-47, 58-64, 91-96, 123-126

[\x21-\x2F\x3A-\x40\x5B-\x60\x7B-\x7E] 

Однако вы можете думать о специальных символах, как не нормальных символы.Если принять этот подход, вы можете просто сделать это

^[A-Za-z0-9\s]+ 

Хауэр это не поймаешь _^ и, возможно, другие.

+0

Наконец, я использовал '(? i)^([[az] [^ a-z0-9 \\ s \\ (\\) \\ [\\] \\ {\\} \\\\^\\ $ \\ | \\? \\ * \\ + \\. \\ <\\> \\ - \\ = \\! \\ _]] *) $ 'для соответствия любому символу. – cdaiga

+0

Все, что лучше всего подходит для вас! –

+1

** Никогда не используйте '[A-z]' в регулярном выражении **. Он соответствует всем строчным и строчным буквам ASCII, как и следовало ожидать. но он также соответствует нескольким символам пунктуации, чьи кодовые точки лежат между «Z» и «a». Вместо этого используйте '[A-Za-z]' или '[a-z]' в режиме без учета регистра. –

2

Try:

(?i)^([[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]]*)$ 

(?i)^(A)$: указывает на то, что регулярное выражение A чувствителен к регистру.

[a-z]: представляет любой буквенный символ от a до z.

[^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]: представляет любой буквенный символ, кроме a, до z, цифры и специальные символы, то есть акцентированные символы.

[[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\<\\>\\-\\=\\!\\_]]: представляет любые символы только буквенного характера (с акцентом или без акцента).

*: одно или несколько появлений регулярного выражения, которое предшествует ему.

+0

Это был бы лучший ответ, если бы он включал объяснение вместе с кодом. –

+0

@JohnHascall, я просто добавил объяснение. – cdaiga

+0

Внутри класса символов ни один из этих символов не должен быть экранирован, кроме '\' и '-'. Многим из них никогда не нужно бежать. «Лучше безопасно, чем жаль» - это прекрасная философия, но читаемость также важна. –

1

Используйте этот шаблон регулярного выражения ("^ [A-Za-Z0-9] * $") .Он проверяет алфавитно-цифровую строку за исключением специальных символов

0

(^ \ W $)

^- начало строки, \ W - соответствует любому символу, кроме буквы [^ A-Za-z0-9_], $ - конец строки

0

Попробуйте использовать это для одних и тех же вещей - StringUtils.isAlphanumeric(value)

1

Вот мой вариант регулярного выражения специального cha racter:

String regExp = "^[^<>{}\"/|;:.,[email protected]#$%^=&*\\]\\\\()\\[¿§«»ω⊙¤°℃℉€¥£¢¡®©0-9_+]*$"; 

(Java-код)

+1

вы пропустили • ☺ ○ ♣ ♥ ☻☺ и больше .. – Aks4125