Java REGEX允许排除字符

时间:2017-12-21 17:06:33

标签: java regex

我有下面的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");

3 个答案:

答案 0 :(得分: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 :(得分:-1)

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

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

Pattern docs

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

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

答案 2 :(得分:-1)

抱歉 - 我现在意识到我有许多元字符都需要转义。以下REGEX按预期运行,使用双反斜杠来转义每个元字符:

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

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