4

美好的一天堆栈溢出。

我是使用正则表达式的菜鸟,这是我的问题 - 如果密码包含 4 个连续字符,我需要检查它。到目前为止,我刚刚介绍的是关于数字的。这是我的正则表达式:

升序数字 - ^。?(?:0123|1234|2345|3456|4567|5678|6789)。$

递减数字 - ^. ?(?:9876|8765|7654|6543|5432|4321|3210)。$

这仅适用于数字。我知道这在正则表达式中已经是一种矫枉过正,所以我不想用字母来做。如果我这样做,那就太矫枉过正了。

abcdblah //因为 abcd 而为真

helobcde //true 因为 bcde

dcbablah //真正的因为 dcba

heloedcb //true 因为 edcb

任何帮助将不胜感激。感谢堆栈溢出。

4

5 回答 5

7

答案很简单:不要使用正则表达式。

使用这种方法:

  • 遍历每个字母(当然,跳过最后一个树字母)
    • 遍历接下来的三个字母并检查升序
      • 如果它们都在上升,则返回 true。
    • 遍历接下来的三个字母并检查降序
      • 如果它们都在下降,则返回 false。
  • 返回假

在代码中,这看起来像这样(未经测试的代码):

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;
}

祝你好运!
堆栈溢出 :)

于 2012-09-19T11:42:02.200 回答
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)降序

于 2012-09-19T11:46:16.267 回答
2

除了列出您想要匹配的每个可能序列的“过度杀伤”解决方案之外,没有办法使用正则表达式来解决这个问题。正则表达式的表达力不足以提供更好的解决方案。

于 2012-09-19T11:43:17.950 回答
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;
}
于 2012-09-19T12:09:53.013 回答
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 语句永远不会为真。

上面的代码使用>升序检查。用于<降序

于 2012-09-19T11:45:29.790 回答