Перевірте, чи містить рядок спеціальний символ


77

Як перевірити, чи містить рядок такий спеціальний символ, як:

[,],{,},{,),*,|,:,>,

2
Для чого це? У мене неприємне відчуття, що це якийсь дезінфікуючий засіб, щоб, скажімо, запобігти атакам введення SQL на веб-сайт. О ні! Це не був би правильний спосіб зробити це ...
Буде

2
потрібно використовувати регулярний вираз.
Мухаммед Імран Тарік,

Відповіді:


128
Pattern p = Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
Matcher m = p.matcher("I am a string");
boolean b = m.find();

if (b)
   System.out.println("There is a special character in my string");

3
вам потрібно імпортувати правильний збіг та шаблон. імпортувати java.util.regex.Matcher; імпортувати java.util.regex.Pattern; Цей код чудово підходить для розповіді про рядок, що передається, містить лише az та 0-9, він не дасть вам розташування "поганого" символу або того, що це таке, але тоді запитання про це не задавало. Я вважаю, що регулярний вираз - це чудова навичка для програміста, яку я маю опанувати, я все ще намагаюся.
Джеф Портер,

1
якщо ви хочете показати поганого персонажа, ви можете використовувати m.group () або m.group (index)
AITAALI_ABDERRAHMANE

Це дозволить вам алфавітно-цифрову перевірку. Якщо ви оновите Reg Ex трішки Like => [^ az], тоді воно буде перевіряти лише альфа-символи.
Кришна Кумар Чорасія

24

Ви можете використовувати наступний код для виявлення спеціального символу з рядка.

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)
        System.out.println("There is a special character in my string ");
     else
         System.out.println("There is no special char.");
     return 0;
 }
}

Якщо порівнювати з "abc", тоді дається true, але якщо порівнювати з "", тоді дається false.
Рахул Растогі

21

Якщо ви хочете, щоб у вашому паролі були принаймні 8 цифр, БУКВ, СПЕЦІАЛЬНИХ ХАРАКТЕРІВ І НОМЕРІВ, використовуйте цей код, він чудово працює

public static boolean Password_Validation(String password) 
{

    if(password.length()>=8)
    {
        Pattern letter = Pattern.compile("[a-zA-z]");
        Pattern digit = Pattern.compile("[0-9]");
        Pattern special = Pattern.compile ("[!@#$%&*()_+=|<>?{}\\[\\]~-]");
        //Pattern eight = Pattern.compile (".{8}");


           Matcher hasLetter = letter.matcher(password);
           Matcher hasDigit = digit.matcher(password);
           Matcher hasSpecial = special.matcher(password);

           return hasLetter.find() && hasDigit.find() && hasSpecial.find();

    }
    else
        return false;

}

14

Якщо він відповідає регулярному виразу, [a-zA-Z0-9 ]*тоді в ньому немає спеціальних символів.


Це не надійно! Він лише перевіряє a-zA-Z0-9. Спробуйте перевірити це на 123%#@ABCвведення. Це повертається правдою.
R

@RSun Це поверне помилку
stepanian

9

Що ви власне називаєте "особливим персонажем"? Якщо ви маєте на увазі щось на зразок "що-небудь, що не є буквено-цифровим", ви можете використовувати клас org.apache.commons.lang.StringUtils (методи IsAlpha / IsNumeric / IsWhitespace / IsAsciiPrintable).

Якщо він не такий тривіальний, ви можете використати регулярний вираз, який визначає точний прийнятий список символів і порівнює рядок із ним.


7

Все залежить від того, що саме ви маєте на увазі під «особливим». У регулярному виразі ви можете вказати

  • \ W означає неальфаномеричний
  • \ p {Пункт} для пунктуації

Я підозрюю, що ви маєте на увазі останнє. Але якщо не використовувати список [], щоб точно вказати, що ви хочете.


6

Погляньте на java.lang.Character клас. У ньому є кілька методів тестування, і ви можете знайти той, який відповідає вашим потребам.

Приклади: Character.isSpaceChar(c)або!Character.isJavaLetter(c)


3

Спочатку ви повинні вичерпно визначити спеціальні символи, які ви хочете перевірити.

Тоді ви можете написати регулярний вираз і використовувати

public boolean matches(String regex)

Набагато безпечніше скласти список прийнятних символів і перевірити це.
Chris Nava

2
Pattern p = Pattern.compile("[\\p{Alpha}]*[\\p{Punct}][\\p{Alpha}]*");
        Matcher m = p.matcher("Afsff%esfsf098");
        boolean b = m.matches();

        if (b == true)
           System.out.println("There is a sp. character in my string");
        else
            System.out.println("There is no sp. char.");

2

Це спрацювало для мене:

String s = "string";
if (Pattern.matches("[a-zA-Z]+", s)) {
 System.out.println("clear");
} else {
 System.out.println("buzz");
}

2

Це тестується в android 7.0 до android 10.0, і це працює

Використовуйте цей код, щоб перевірити, чи рядок містить спеціальні символи та цифри:

  name = firstname.getText().toString(); //name is the variable that holds the string value

  Pattern special= Pattern.compile("[^a-z0-9 ]", Pattern.CASE_INSENSITIVE);
  Pattern number = Pattern.compile("[0-9]", Pattern.CASE_INSENSITIVE);
  Matcher matcher = special.matcher(name);
  Matcher matcherNumber = number.matcher(name);

  boolean constainsSymbols = matcher.find();
  boolean containsNumber = matcherNumber.find();

  if(constainsSymbols == true){
   //string contains special symbol/character
  }
  else if(containsNumber == true){
   //string contains numbers
  }
  else{
   //string doesn't contain special characters or numbers
  }

1

Завітайте до кожного символу в рядку, щоб побачити, чи є цей символ у чорному списку спеціальних символів; це O (n * m).

Псевдокодом є:

for each char in string:
  if char in blacklist:
    ...

Складність можна трохи покращити, відсортувавши чорний список, щоб можна було достроково вийти з кожної перевірки. Однак функція пошуку рядків є, мабуть, власним кодом, тому ця оптимізація - яка б виконувалася в байт-коді Java - цілком може бути повільнішою.


1

// без використання регулярного виразу ........

    String specialCharacters=" !#$%&'()*+,-./:;<=>?@[]^_`{|}~0123456789";
    String name="3_ saroj@";
    String str2[]=name.split("");

    for (int i=0;i<str2.length;i++)
    {
    if (specialCharacters.contains(str2[i]))
    {
        System.out.println("true");
        //break;
    }
    else
        System.out.println("false");
    }

1

// це оновлена ​​версія коду, який я опублікував / * Метод isValidName перевірить, чи не повинно містити ім'я, передане в якості аргументу - 1. нульове значення або пробіл 2. будь-який спеціальний символ 3. Цифри (0-9) Пояснення - - Тут str2 є змінною масиву String, яка зберігає роздільний рядок імені, яке передається як аргумент Змінна count буде рахувати кількість спеціальних символів, що виникають. Метод поверне true, якщо він задовольняє всім умовам * /

public boolean isValidName(String name)
{
    String specialCharacters=" !#$%&'()*+,-./:;<=>?@[]^_`{|}~0123456789";
    String str2[]=name.split("");
    int count=0;
    for (int i=0;i<str2.length;i++)
    {
        if (specialCharacters.contains(str2[i]))
        {
            count++;
        }
    }       

    if (name!=null && count==0 )
    {
        return true;
    }
    else
    {
        return false;
    }
}

1

у рядку Рядок str2 [] = name.split (""); дайте зайвий символ у масиві ... Дозвольте пояснити на прикладі "Aditya" .split ("") поверне [, A, d, i, t, y, a] У вашому масиві буде додатковий символ .. .
"Aditya" .split ("") не працює, як очікував saroj routray. Ви отримаєте додатковий символ у рядку => [, A, d, i, t, y, a].

Я змінив його, див. Нижче код, він працює як слід

 public static boolean isValidName(String inputString) {

    String specialCharacters = " !#$%&'()*+,-./:;<=>?@[]^_`{|}~0123456789";
    String[] strlCharactersArray = new String[inputString.length()];
    for (int i = 0; i < inputString.length(); i++) {
         strlCharactersArray[i] = Character
            .toString(inputString.charAt(i));
    }
    //now  strlCharactersArray[i]=[A, d, i, t, y, a]
    int count = 0;
    for (int i = 0; i <  strlCharactersArray.length; i++) {
        if (specialCharacters.contains( strlCharactersArray[i])) {
            count++;
        }

    }

    if (inputString != null && count == 0) {
        return true;
    } else {
        return false;
    }
}

0

Перетворіть рядок у масив символів із усіма літерами, написаними малими літерами:

char c[] = str.toLowerCase().toCharArray();

Потім ви можете використовувати, Character.isLetterOrDigit(c[index])щоб з’ясувати, який індекс має спеціальні символи.


-1

Використовуйте статичний метод класу java.util.regex.Pattern, що відповідає (регулярний вираз, String obj)
регулярному виразу: символи з малої та верхньої літери та цифри від 0 до 9
.

Він повертає логічне значення true, якщо містить лише символи та числа, інакше повертає логічне значення false

Приклад.

String isin = "12GBIU34RT12";<br>
if(Pattern.matches("[a-zA-Z0-9]+", isin)<br>{<br>
   &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Valid isin");<br>
}else{<br>
   &nbsp; &nbsp; &nbsp; &nbsp;System.out.println("Invalid isin");<br>
}
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.