美好的一天堆栈溢出。
我是使用正则表达式的菜鸟,这是我的问题 - 如果密码包含4个连续字符,我需要检查密码。到目前为止,我刚刚介绍的是数字。这是我的正则表达式:
升序数字 - ^。?(?:0123 | 1234 | 2345 | 3456 | 4567 | 5678 | 6789)。 $
降序数字 - ^。?(?:9876 | 8765 | 7654 | 6543 | 5432 | 4321 | 3210)。 $
这仅适用于数字。我知道这已经是正则表达式的一种矫枉过正,所以我不想用字母来做。如果我这样做,那将太过分了。
abcdblah //因abcd
而为真helobcde //因为bcde而为真
dcbablah //真是因为dcba
heloedcb //因为edcb
而为真任何帮助都将受到高度赞赏。谢谢stackoverflow。
答案 0 :(得分:7)
答案很简单:不要使用正则表达式。
使用这种方法:
在代码中,这看起来像这样(未经测试的代码):
public boolean checkForAscendingOrDescendingPart(String txt, int l)
{
for (int i = 0; i <= txt.length() - l; ++i)
{
boolean success = true;
char c = txt.charAt(i);
for (int j = 1; j < l; ++j)
{
if (((char) c + j) != txt.charAt(i + j))
{
success = false;
break;
}
}
if (success) return true;
success = true;
for (int j = 1; j < l; ++j)
{
if (((char) c - j) != txt.charAt(i + j))
{
success = false;
break;
}
}
if (success) return true;
}
return false;
}
祝你好运!答案 1 :(得分:4)
这是一个不使用正则表达式的想法: 所有字符都有ansi值,通常是连续的。所以abcd应该让我们说下面的ansi值:64,65,66,67
伪代码:
for (i=string.start;i<string.end-4;i++) {
check=string.substring(i,4);
c1=check.substring(0,1);
c2=check.substring(1,1);
c3=check.substring(2,1);
c4=check.substring(3,1);
if (c1.ansival==c2.ansival+1 && c2.ansival==c3.ansival+1 && c3.ansival==c4.ansival+1) {
return false;
} else {
return true;
}
}
也按相反的顺序重复(c1.ansival + 1 == c2.ansival)降序
答案 2 :(得分:2)
除了列出您想要匹配的每个可能序列的“过度杀伤”解决方案之外,没有办法使用正则表达式来解决这个问题。正则表达式不足以提供更好的解决方案。
答案 3 :(得分:2)
这是我的解决方案。它只使用一个循环。
请记住,如果要将其约束为纯ASCII,则需要更多逻辑。
static boolean isWeak(String pass) {
Character prev = null;
Boolean asc = null;
int streak = 0;
for (char c : pass.toCharArray()) {
if (prev != null) {
switch (c - prev) {
case -1:
if (Boolean.FALSE.equals(asc)) streak++;
else { asc = false; streak = 2; }
break;
case 1:
if (Boolean.TRUE.equals(asc)) streak++;
else { asc = true; streak = 2; }
break;
default: asc = null; streak = 0;
}
if (streak == 4) return true;
}
prev = c;
}
return false;
}
答案 4 :(得分:0)
考虑一下
String s = "aba";
for (int i = 0; i < s.length() - 1; i++) {
if (!(Character.isLetter(c1) && Character.isLetter(c2))) {
//reject
}
if ((int)s.charAt(i) > (int)s.charAt(i + 1))) {
//reject
}
}
对于s,if语句是真的,所以你可以拒绝它。如果s是abc那么if语句永远不会成立。
上面的代码使用>
检查升序。使用<
降序