检查字符串是否有四个连续的字母,按升序或降序排列

时间:2012-09-19 11:37:44

标签: java regex string automata

美好的一天堆栈溢出。

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

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

降序数字 - ^。?(?:9876 | 8765 | 7654 | 6543 | 5432 | 4321 | 3210)。 $

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

abcdblah //因abcd

而为真

helobcde //因为bcde而为真

dcbablah //真是因为dcba

heloedcb //因为edcb

而为真

任何帮助都将受到高度赞赏。谢谢stackoverflow。

5 个答案:

答案 0 :(得分:7)

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

使用这种方法:

  • 遍历每个字母(当然,跳过最后一个树字母)
    • 迭代接下来的三个字母并检查升序
      • 如果他们都升序返回真实。
    • 迭代接下来的三个字母并检查降序
      • 如果他们都下降返回false。
  • return 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;
}
祝你好运!
StackOverflow:)

答案 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语句永远不会成立。

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