【问题标题】:Check if a String contains a special character检查字符串是否包含特殊字符
【发布时间】:2010-12-20 04:55:58
【问题描述】:

如何检查字符串是否包含特殊字符,例如:

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

【问题讨论】:

  • 它有什么用?我有一种讨厌的感觉,这是某种现场消毒剂,例如,防止网站上的 SQL 注入攻击。不好了!这不是解决问题的正确方法......
  • 你需要使用正则表达式。

标签: java string special-characters


【解决方案1】:

这是在 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
  }

【讨论】:

    【解决方案2】:

    您可以使用以下代码从字符串中检测特殊字符。

    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”比较则为真,但如果与“”比较则为假。
    【解决方案3】:

    使用java.util.regex.Pattern类的静态方法matches(regex, String obj)
    正则表达式:小写和大写字符以及 0-9 之间的数字
    String obj : 您要检查是否包含特殊字符的字符串对象。

    如果只包含字符和数字则返回布尔值 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>
    }
    

    【讨论】:

      【解决方案4】:

      这对我有用:

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

      【讨论】:

        【解决方案5】:

        将字符串转换为所有字母小写的char数组:

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

        那么你可以使用Character.isLetterOrDigit(c[index])来找出哪个索引有特殊字符。

        【讨论】:

          【解决方案6】:

          在字符串 str2[]=name.split("");在 Array 中给出一个额外的字符... 让我举例说明 "Aditya".split("") 将返回 [, A, d,i,t,y,a] 您的数组中将有一个额外的字符...
          "Aditya".split("") 无法按 saroj routray 的预期工作,您将在 String => [, 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;
              }
          }
          

          【讨论】:

            【解决方案7】:

            //这是我发布的代码的更新版本 /* isValidName 方法将检查作为参数传递的名称是否不应包含 - 1.null值或空格 2.任何特殊字符 3.数字(0-9) 解释 - - 这里 str2 是字符串数组变量,它存储作为参数传递的名称的拆分字符串 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;
                }
            }
            

            【讨论】:

              【解决方案8】:

              //不使用正则表达式............

                  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");
                  }
              

              【讨论】:

                【解决方案9】:

                如果您想在密码中包含至少 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;
                
                }
                

                【讨论】:

                • 感谢分享,这正是我需要的!
                【解决方案10】:
                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");
                

                【讨论】:

                • 您需要导入正确的匹配器和模式。导入 java.util.regex.Matcher;导入 java.util.regex.Pattern;此代码非常适合告诉传入的字符串仅包含 a-z 和 0-9,它不会为您提供“坏”字符的位置或它是什么,但是问题并没有要求那个。我觉得正则表达式对于程序员来说是一项很棒的技能,我还在尝试。
                • 如果要显示坏字符可以使用 m.group() 或 m.group(index)
                • 这将允许您进行字母数字验证。如果您更新 Reg Ex 一点点 Like => [^a-z] ,它将仅验证字母字符。
                【解决方案11】:

                如果匹配正则表达式[a-zA-Z0-9 ]*,则其中没有特殊字符。

                【讨论】:

                • 这不靠谱!它只检查a-zA-Z0-9。尝试对照123%#@ABC 输入检查这个。它返回 true。
                • @RSun 这将返回 false
                【解决方案12】:
                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.");
                

                【讨论】:

                  【解决方案13】:

                  首先,您必须详尽地确定要检查的特殊字符。

                  然后你可以写一个正则表达式并使用

                  public boolean matches(String regex)
                  

                  【讨论】:

                  • 列出可接受的字符并进行检查会更安全。
                  【解决方案14】:

                  访问字符串中的每个字符,查看该字符是否在特殊字符的黑名单中;这是 O(n*m)。

                  伪代码为:

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

                  通过对黑名单进行排序可以稍微提高复杂性,以便您可以提前退出每项检查。但是,字符串查找函数可能是本机代码,因此这种优化(在 Java 字节码中)可能会更慢。

                  【讨论】:

                    【解决方案15】:

                    看看java.lang.Character 类。它有一些测试方法,您可能会找到适合您需要的一种。

                    示例:Character.isSpaceChar(c)!Character.isJavaLetter(c)

                    【讨论】:

                      【解决方案16】:

                      一切都取决于您所说的“特殊”是什么意思。在正则表达式中,您可以指定

                      • \W 表示非字母数字
                      • \p{Punct} 表示标点符号

                      我怀疑后者就是你的意思。但如果不使用 [] 列表来准确指定您想要的内容。

                      【讨论】:

                        【解决方案17】:

                        你到底把什么叫做“特殊字符”?如果你的意思是“任何不是字母数字的东西”,你可以使用 org.apache.commons.lang.StringUtils 类(方法 IsAlpha/IsNumeric/IsWhitespace/IsAsciiPrintable)。

                        如果不是那么简单,您可以使用一个正则表达式来定义您接受的确切字符列表并将字符串与之匹配。

                        【讨论】:

                          猜你喜欢
                          • 2016-08-24
                          • 2016-08-01
                          • 2014-11-25
                          • 2021-11-21
                          • 1970-01-01
                          • 2013-06-03
                          • 2015-05-06
                          • 1970-01-01
                          • 1970-01-01
                          相关资源
                          最近更新 更多