【问题标题】:Regex pattern including all special characters包括所有特殊字符的正则表达式模式
【发布时间】:2013-08-06 03:33:34
【问题描述】:

我想编写一个简单的正则表达式来检查给定字符串中是否存在任何特殊字符。我的正则表达式有效,但我不知道为什么它还包含所有数字,所以当我输入一些数字时它会返回错误。

我的代码:

//pattern to find if there is any special character in string
Pattern regex = Pattern.compile("[$&+,:;=?@#|'<>.-^*()%!]");
//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!");
}

【问题讨论】:

  • [] 中的破折号应该被转义,它在那里有特殊含义。
  • ¿¡ 所以你认为唯一存在的特殊字符是键盘上的那些!? :-)
  • 没错。最好定义所有“非特殊”字符并将其设为否定。
  • 是的,也许断言只使用您想要允许的字符会更明智。
  • 能否提供解决方案 String.replace("\"", """)

标签: java regex


【解决方案1】:

使用它来捕获除.-_ 之外的常见特殊字符。

/[!"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+/

如果你也想包含.-_,那么使用这个:

/[-._!"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+/

如果您想过滤对 URL 友好且不包含任何特殊字符或空格的字符串,请使用:

/^[^ !"`'#%&,:;<>=@{}~\$\(\)\*\+\/\\\?\[\]\^\|]+$/

当您使用 /[^A-Za-z0-9]/ 之类的模式时,您将开始捕捉其他语言中的特殊字母和一些欧洲重音字母(例如 é、í )。

【讨论】:

    【解决方案2】:

    请不要那样做...像这样的小 Unicode BABY ANGELs ? 快死了! ◕◡◕(←这些不是图片)(箭头也不是!)

    而你正在扼杀 20 年的 DOS :-)(最后一个笑脸叫 WHITE SMILING FACE...现在是 263A...但在古代它是 ALT-1

    和他的朋友

    BLACK SMILING FACE...现在是263B...但在古代是ALT-2

    尝试否定匹配:

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

    (这只能A-Z“标准”字母和“标准”0-9数字。)

    【讨论】:

    • @AbdullahShoaib 显然不是 :) 您需要列出您认为“特别”和/或您认为“好”的内容。
    • 我注意到很多人使用[A-Za-z0-9] 来表示任何字母或数字,包括小写和大写,但使用[0-z] 不是更好吗?
    • @AbrahamMurcianoBenzadon:十进制数字、大写罗马字母和小写罗马字母占据三个不相交范围的字符代码空间。
    • @AbrahamMurcianoBenzadon 你可以在新浪发布的Character Map的方便截图中看到James在另一个回复中写道:你的正则表达式会接受:;?@[]^_`(0-9、az、AZ 除外)
    • @AbdullahShoaib 正确处理非英文字母,最好使用[^\p{Alnum}]
    【解决方案3】:

    要查找任意数量的特殊字符,请使用以下正则表达式模式: ([^(A-Za-z0-9 )]{1,})

    [^(A-Za-z0-9 )] 这表示除字母、数字和空格之外的任何字符。 {1,0} 这表示前一个块的一个或多个字符。

    【讨论】:

    • 找不到()
    【解决方案4】:

    试试这个。它适用于 C#,它也应该适用于 java。如果要排除空格,只需在其中添加 \s @"[^\p{L}\p{Nd}]+"

    【讨论】:

      【解决方案5】:

      您可以使用否定匹配:

      Pattern regex = Pattern.compile("([a-zA-Z0-9])*"); (对于零个或多个字符)

      Pattern regex = Pattern.compile("([a-zA-Z0-9])+"); (对于一个或多个字符)

      【讨论】:

      • 问题不是只允许罗马数字和英文字母,如果用户想要除了日文文本,你的解决方案是行不通的。
      【解决方案6】:

      我已经定义了一种模式来查找范围在 032 到 126 之间的任何 ASCII 特殊字符,除了字母数字。您可以使用类似以下的内容:

      要查找任何特殊字符:

      [ -\/:-@\[-\`{-~]
      

      要找到任何计数的最小值和最大值:

      (?=.*[ -\/:-@\[-\`{-~]{1,})
      

      这些模式的特殊字符介于 032 到 047、058 到 064、091 到 096 以及 123 到 126 之间。

      【讨论】:

        【解决方案7】:

        对于寻找特殊字符(如 Ä 等)的答案的人(如我),只需使用以下模式:

        • 仅文本(或空格):“[A-Za-zÀ-ȕ ]”

        • 文本和数字:“[A-Za-zÀ-ȕ0-9 ]”

        • 文本、数字和一些特殊字符:“[A-Za-zÀ-ȕ0-9(),-_., ]”

        正则表达式仅从 ascii 索引开始,并检查字符串的字符是否在两个索引 [startindex-endindex] 中。

        因此您可以添加任何范围。

        最终你可以使用一个方便的工具:https://regexr.com/

        祝你好运;)

        【讨论】:

          【解决方案8】:

          请用这个..最简单的。

          \p{Punct} 标点符号:!"#$%&'()*+,-./:;?@[]^_`{|}~

          之一

          https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

              StringBuilder builder = new StringBuilder(checkstring);
              String regex = "\\p{Punct}"; //Special character : `~!@#$%^&*()-_+=\|}{]["';:/?.,><
              //change your all special characters to "" 
              Pattern  pattern = Pattern.compile(regex);
              Matcher matcher = pattern.matcher(builder.toString());
              checkstring=matcher.replaceAll("");
          

          【讨论】:

            【解决方案9】:

            这是我的正则表达式,用于从任何字符串中删除所有特殊字符:

            String regex = ("[ \\\\s@  [\\\"]\\\\[\\\\]\\\\\\\0-9|^{#%'*/<()>}:`;,!& .?_$+-]+")
            

            【讨论】:

            • 完美地为我工作,但小的变化是为了逃避 '\'(反斜杠)我们应该使用 "\\\\\\\\"
            【解决方案10】:

            我们可以使用 Pattern 和 Matcher 来实现这一点,如下所示:

            Pattern pattern = Pattern.compile("[^A-Za-z0-9 ]");
            Matcher matcher = pattern.matcher(trString);
            boolean hasSpecialChars = matcher.find();
            

            【讨论】:

              【解决方案11】:

              这是我的特殊字符的正则表达式变体:

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

              (Java 代码)

              【讨论】:

                【解决方案12】:

                尝试将其用于相同的事情 - StringUtils.isAlphanumeric(value)

                【讨论】:

                • space/blank 如果你使用这个方法也是一个特殊的字符。最好在调用此方法之前替换空格和制表符。
                【解决方案13】:

                (^\W$)

                ^ - 字符串的开头, \W - 匹配任何非单词字符 [^a-zA-Z0-9_], $ - 字符串结尾

                【讨论】:

                  【解决方案14】:

                  使用这个正则表达式模式(“^[a-zA-Z0-9]*$”)。它验证不包括特殊字符的字母数字字符串

                  【讨论】:

                    【解决方案15】:

                    试试:

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

                    (?i)^(A)$:表示正则表达式A不区分大小写。

                    [a-z]:代表从az的任意字母字符。

                    [^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\&lt;\\&gt;\\-\\=\\!\\_]:表示除az、数字和特殊字符(即重音字符)之外的任何字母字符。

                    [[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\&lt;\\&gt;\\-\\=\\!\\_]]:表示任何字母(重音或非重音)字符。

                    *:出现一次或多次前面的正则表达式。

                    【讨论】:

                    • 在一个字符类中,除了` and -`,这些字符都不需要转义。他们中的许多人根本不需要逃脱。 “比后悔更安全”是一个很好的理念,但可读性也很重要。
                    【解决方案16】:

                    如果您只依赖 ASCII 字符,则可以依赖使用 ASCII 表中的十六进制范围。这是一个正则表达式,它将抓取33-4758-6491-96123-126 范围内的所有特殊字符

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

                    但是您可以将特殊字符视为而不是普通字符。如果我们采用这种方法,您可以简单地这样做

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

                    但是这不会捕获 _ ^ 和可能的其他人。

                    【讨论】:

                    • 我终于用(?i)^([[a-z][^a-z0-9\\s\\(\\)\\[\\]\\{\\}\\\\^\\$\\|\\?\\*\\+\\.\\&lt;\\&gt;\\-\\=\\!\\_]]*)$来匹配任意字符了。
                    • 永远不要在正则表达式中使用[A-z]它匹配所有大写和小写的 ASCII 字母,正如你所期望的那样。但它也匹配几个标点符号,其代码点位于Za 之间。请改用[A-Za-z],或在不区分大小写模式下使用[a-z]
                    • @AlanMoore,很高兴知道!我会更改答案。
                    • '.'怎么样点字符。它支持匹配除换行符以外的任何字符。在 python re.DOTALL 匹配所有包括换行符。查看python教程中的正则表达式faqdocs.python.org/2/howto/regex.html
                    【解决方案17】:

                    这是因为您的模式包含 .-^,它是介于 .^ 之间的所有字符,其中包括数字和其他几个字符,如下所示:

                    如果是特殊字符,你的意思是标点和符号使用:

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

                    其中包含所有 unicode 标点和符号。

                    【讨论】:

                      【解决方案18】:

                      因为你的字符类中没有空格和下划线,我认为遵循正则表达式对你来说会更好:

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

                      这意味着匹配除[A-Za-z0-9\s_]之外的所有内容

                      Unicode 版本:

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

                      【讨论】:

                        【解决方案19】:

                        字符类中间有一个破折号,表示字符范围。将破折号放在类的末尾,如下所示:

                        [$&+,:;=?@#|'<>.^*()%!-]
                        

                        【讨论】:

                        • 能否提供解决方案 String.replace("\"", """);
                        • @LovaChittumuri 请清楚说明您的问题。您想要实现什么、输入和期望的输出。
                        猜你喜欢
                        • 2020-07-02
                        • 2023-03-16
                        • 1970-01-01
                        • 1970-01-01
                        • 2013-09-21
                        • 1970-01-01
                        • 1970-01-01
                        • 1970-01-01
                        • 2010-10-19
                        相关资源
                        最近更新 更多