2

組み合わせた正規表現では、機能しているように見えますが、パターンで使用すると失敗します。助けてください。

^(?=.*\\p{Nd})(?=.*\\p{L})(?!.*(.{2,})\\1).{5,12}$

これは機能しているようですが、分割すると失敗します。

^(?=.*\\p{Nd})(?=.*\\p{L})

また、特殊文字を無視し、文字/アルファと数字(少なくとも1つのアルファと1つの数字)の混合を受け入れるためのUNICODE検証を探しています

public void setValidations(){
        validation1 = "^(?=.*\\p{Nd})(?=.*\\p{L})"; //this is failing
        validation2 = "^.{5,12}$";
        validation3 = "(\\S+?)\\1";
        p1 = Pattern.compile(validation1);
        p3 = Pattern.compile(validation3);
    }
    public boolean validateString(String str){
        matcher1 = p1.matcher(str);
        matcher3 = p3.matcher(str);
        if(matcher1.find()){ //Expecting string passed "invalid" to fail (no numeric in it)
            System.out.println(str + " String must have letters & number at least one");
            return false;
        }
        if (!str.matches(validation2)){
            System.out.println(str  + " String must be between 5 and 12 chars in length");
            return false;
        }
        if (matcher3.find()){
            System.out.println(str + " got repeated: " + matcher3.group(1) + " String must not contain any immediate repeated sequence of characters");
            return false;    
        }
        return true;
    }
public static void main(String[] args) {
    StringValidation sv = new StringValidation();
    String s2[] = {"1newAb", "A1DOALDO", "1234567AaAaAaAa", "123456ab3434", "$1214134abA", "invalid"};
    boolean b3;
    for(int i=0; i<s2.length; i++){
       b3 = s2[i].matches("^(?=.*\\p{Nd})(?=.*\\p{L})(?!.*(.{2,})\\1).{5,12}$");

       System.out.println(s2[i] +  "  "+ b3); // string "invalid" returning false (expected)
    }
    for (String str : s2) {
            if(sv.validateString(str))
                System.out.println(str + "String is Valid");
    }
}

また、「$1214134abA」という文字列には $ があるため、この文字列は失敗します。

4

2 に答える 2

2

で否定を使用するのを忘れたようです

if(matcher1.find()){ //Expecting
    ... 
    return false;
}

一致するものが見つからない場合はfalseを返す必要があります。で試してみてください

if(!matcher1.find()){ //Expecting...

.{5,12}また、文字列全体が最後ではなく文字と数字で構成されているかどうかを確認したいので、試してみてください[\\p{L}\\p{Nd}]{5,12}

于 2013-03-14T05:21:18.630 に答える
2

Pattern.compile("^(?=.*\\p{Nd})(?=.*\\p{L})").matcher("invalid").find()"invalid"数字が含まれていないため、falseを返します。したがって、if条件はfalseと評価され、そのブロックはスキップされます。

^(?=[\\p{Nd}\\p{L}]*\\p{Nd})(?=[\\p{Nd}\\p{L}]*\\p{L})文字と数字以外の文字を避けるために使用します。

$1214134abAが含まれているため、受け入れられません$

于 2013-03-14T05:27:23.993 に答える