这个问题在这里已有答案:
我有下面的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");
^[a-zA-z0-9!$%^&*()-_=+]+?$
^^^ ^^^
第一个带下划线的范围是A-z
。匹配:
ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz
第二个带下划线的范围对应于
)*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_
See regex in use here:注意正则表达式只是下面第一个例子的集合。这是为了显示它实际匹配的字符。
使用以下任一方法
^[a-zA-Z0-9!$%^&*()\-_=+]+?$
^[a-zA-Z0-9!$%^&*()_=+-]+?$
^[\w!$%^&*()=+-]+?$
^[\w!$%&^(-+=-]+?$
你的正则表达式的问题是它包含需要转义的特殊字符。
如果密码中有效,则此页面中引用的所有字符都需要转义。
因此,您应该使用如下所示的正则表达式。但是,我还没有对此进行过彻底的测试,所以请写一些彻底的单元测试来涵盖所有合法的可能性。
"^[a-zA-z0-9!\\$%\\^&\\*\\(\\)\\-_\\=\\+]+?$"
对不起 - 我现在意识到我有一些所有需要转义的元字符。以下REGEX按预期运行,使用双反斜杠来转义每个元字符:
final String REGEX = "^[a-zA-z0-9\\!\\$%\\^&*\\(\\)\\-_\\=\\+]+?$";
如果有一种更优雅的方式,我很乐意听到它!