允许排除字符的Java REGEX [重复]

问题描述 投票:0回答:3

这个问题在这里已有答案:

我有下面的REGEX,我希望排除某些字符。这些字符被正确排除:£“〜#¬| {}但这些不是:@ [] /?;:

因此,例如,test£test被正确识别为无效,但test @ test被错误地识别为有效。

https://regex101.com/上测试这个问题将问题标识为括号并指示我需要逃避第一个([括号]和 - [连字符]这样 - ^ [a-zA-z0-9!$%^&* \() \ -_ = +] +?$。在https://regex101.com上,表达式然后按预期运行,但如果我尝试在Java中使用这样的转义字符,编译器会给出错误。

任何想法如何让这个正则表达式按我的意愿行事?对不起,如果这很明显。

         final String REGEX = "^[a-zA-z0-9!$%^&*()-_=+]+?$";
         System.out.println ("Please enter a password");
         String password = input.next();
         Pattern p = Pattern.compile(REGEX);
         Matcher m = p.matcher(password);
         if (!m.matches()){
            System.out.println("Illegal characters");
java regex
3个回答
2
投票

简要

^[a-zA-z0-9!$%^&*()-_=+]+?$
     ^^^          ^^^

第一个带下划线的范围是A-z。匹配:

ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz

第二个带下划线的范围对应于

)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_

ASCII Table


See regex in use here:注意正则表达式只是下面第一个例子的集合。这是为了显示它实际匹配的字符。

使用以下任一方法

^[a-zA-Z0-9!$%^&*()\-_=+]+?$
^[a-zA-Z0-9!$%^&*()_=+-]+?$
^[\w!$%^&*()=+-]+?$
^[\w!$%&^(-+=-]+?$

-1
投票

你的正则表达式的问题是它包含需要转义的特殊字符。

如果密码中有效,则此页面中引用的所有字符都需要转义。

Pattern docs

因此,您应该使用如下所示的正则表达式。但是,我还没有对此进行过彻底的测试,所以请写一些彻底的单元测试来涵盖所有合法的可能性。

"^[a-zA-z0-9!\\$%\\^&\\*\\(\\)\\-_\\=\\+]+?$"

-1
投票

对不起 - 我现在意识到我有一些所有需要转义的元字符。以下REGEX按预期运行,使用双反斜杠来转义每个元字符:

final String REGEX = "^[a-zA-z0-9\\!\\$%\\^&*\\(\\)\\-_\\=\\+]+?$";

如果有一种更优雅的方式,我很乐意听到它!

© www.soinside.com 2019 - 2024. All rights reserved.