gpt4 book ai didi

java - 正则表达式特殊字符在java中字符串的开头不起作用

转载 作者:行者123 更新时间:2023-12-02 12:37:06 24 4
gpt4 key购买 nike

尝试其他变体后,我在 Java 中使用此正则表达式来验证密码:

PatternCompiler compiler = new Perl5Compiler();
PatternMatcher matcher = new Perl5Matcher();
pattern = compiler.compile("^(?=.*?[a-zA-Z])(?![\\\\\\\\_\-])(?=.*?[0-9])([A-Za-z0-9-/-~]
[^\\\\\\\\_\-]*)$");

但它仍然与我预期的测试用例不匹配:

2017 年 4 月 比赛
$$Apr@2017 不匹配,但应该匹配
!!Apr@2017 不匹配,但应该匹配
!#ap#2017 不匹配,但应该匹配
-Apr@2017 它不应该匹配
_Apr@2017 它不应该匹配
\Apr@2017 它不应该匹配

除了剩余的三个特殊字符 - _ \ 之外,所有字符都应该在字符串的开头匹配。

规则:

  • 除上述三个符号外,它应该接受任意次数的所有特殊字符。

  • 它必须且应该在字符串中的任何位置包含一个数字和大写字母。

最佳答案

您有两条规则,为什么不创建多个正则表达式?

It should accept all special characters any number of times except above three symbols.

对于这个,请确保它匹配[-\\_](请注意,-是字符类,否则它将被解释为范围。

It must and should contain one number and Capital letter at any place in the string.

对于这个,请确保它匹配 [A-Z][0-9]

为了方便修改和扩展,请进行一些抽象:

class PasswordRule
{
private Pattern pattern;
// If true, string must match, if false string must not match
private boolean shouldMatch;

PasswordRule(String patternString, boolean shouldMatch)
{
this.shouldMatch = shouldMatch;
this.pattern = compiler.compile(patternString);
}

boolean match(String passwordString)
{
return pattern.matches(passwordString) == shouldMatch;
}
}

我不知道也不关心上面的 Perl5 API 是否正确匹配,但你应该明白了。然后你的规则进入一个数组

PasswordRule rules[] = 
{
PasswordRule("[-\\\\_]", false),
PasswordRule("[A-Z]", true),
PasswordRule("[0-9]", true)
};

boolean passwordIsOk(String password)
{
for (PasswordRule rule : rules)
{
if (!rule.match(password)
{
return false;
}
}
return true;
}

使用上述内容,您的规则比一个巨大的正则表达式更加灵活和可修改。

关于java - 正则表达式特殊字符在java中字符串的开头不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45097824/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com