4

グッドデイスタックオーバーフロー。

私は正規表現の使用に慣れていないので、ここに問題があります。パスワードに4つの連続した文字が含まれている場合は、パスワードを確認する必要があります。これまで私がカバーしたのは数字に関するものです。これが私の正規表現です:

昇順の数字-^。?(?:0123 | 1234 | 2345 | 3456 | 4567 | 5678 | 6789)。$

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

これは数字に対してのみ機能します。私はこれがすでに正規表現でやり過ぎであることを知っているので、私は文字でそれをやりたくありません。私がそうするなら、それはあまりにもやり過ぎでしょう。

abcdblah//abcdのためtrue

helobcde//bcdeのためtrue

dcbablah//dcbaの本当の理由

heloedcb//edcbのためtrue

どんな助けでも大歓迎です。stackoverflowに感謝します。

4

5 に答える 5

7

答えは簡単です。正規表現を使用しないでください。

このアプローチを使用します。

  • 各文字を繰り返し処理します(もちろん、最後のツリー文字はスキップします)
    • 次の3文字を繰り返し、昇順を確認します
      • それらがすべて昇順であった場合はtrueを返します。
    • 次の3文字を繰り返し、降順を確認します
      • それらがすべて降順であった場合、falseを返します。
  • 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ステートメントはtrueになるため、拒否できます。sがabcの場合、ifステートメントは真になりません。

>昇順のチェックを使用する上記のコード。<降順で使用

于 2012-09-19T11:45:29.790 に答える