2013-07-18 47 views
1

我正在進行密碼增強,客戶端想要一個沒有連續字母的密碼,例如:123,234 。RegEx - Java - 匹配字符串(012 | 123 | 234 | 345 | 456 | 567 | 678 | 789 | 890)

我發現你可以聲明你想匹配的正則表達式的字符串,如(012|123|234|345|456|567|678|789|890),並將其作爲正則表達式序列。

此序列與其他序列分開以方便閱讀。

問題是,即使我在密碼字符中包含123或234,我也無法將密碼與模式相匹配。

我讀過,正則表達式不能檢測到123作爲連續的數字,但作爲一個字符串,它可以這樣做嗎?

+0

正則表達式總是處理字符串。他們不知道字符的含義,例如他們不知道2是多於1 – stema

+0

請將您的代碼與未匹配的字符串以及應用正則表達式的位置一起發佈。 – stema

回答

3

如果你有有限的字符序列之後彼此您可以在輸入上匹配使用Pattern.find(),只是反轉測試:

// Only the alternation is needed, no need for the capture 
private static final Pattern PATTERN 
    = Pattern.compile("012|123|234|345|456|567|678|789|890"); 

// ... 

if (PATTERN.matcher(input).find()) 
    // fail: illegal sequence found 

但是,如果你想檢測代碼點一個跟着一個,你必須使用字符函數:

final CharBuffer buf = CharBuffer.wrap(input); 

int maxSuccessive = 0; 
int successive = 0; 
char prev = buf.get(); 
char next; 

while (buf.hasRemaining()) { 
    next = buf.get(); 
    if (next - prev == 1) 
     successive++; 
    else { 
     maxSuccessive = Math.max(maxSuccessive, successive); 
     successive = 0; 
    } 
    prev = next; 
} 

// test maxSuccessive 

不過請注意,這將按照「規範有序」,不覈對測試連續的字符。例如,在某些語言環境中,a之後立即是A,而不是b


更一般地,如果你想測試密碼要求和約束的演變,你最好稍微分割一下。例如,考慮一下:

public interface PasswordChecker 
{ 
    boolean isValid(final String passwd); 
} 

爲每個檢查實現此接口(例如,長度,存在/不存在的某些字符等),當你做檢查密碼,有List的跳棋;密碼是無效的,如果一個檢查返回false:

private final List<PasswordChecker> checkers = ...; 

// then 

for (final PasswordChecker checker: checkers) 
    if (!checker.isValid(passwd)) 
     return false; 
return true; 

如果使用番石榴,你可以忘掉PasswordChecker和使用Predicate<String>

+0

非常感謝你! '如果(PATTERN.matcher(input).find())'爲我工作。 – coferniecus

+0

請注意,你不能接受_two_答案;) – fge

+0

是的,我剛纔注意到了。不管怎麼說,還是要謝謝你 :) – coferniecus

3

如果你只用處理的要排除這些數字串,你可以使用實現這一negative lookahead assertion

^(?!.*(012|123|234|345|456|567|678|789|890))<regex> 

其中<regex>是您使用的是符合實際的正則表達式密碼和(?!...)是斷言在你的正則表達式中不可能匹配該字符串的前瞻。

如果你問任何增加字符序列,那麼正則表達式不是正確的工具。你將不得不以編程方式做到這一點。

+0

爲什麼不使用'.find()'來反轉測試呢? – fge

+0

@fge:當然,如果你想一個接一個地做一系列測試,而不是一個大的(可能很笨拙的)正則表達式,那也是一個有效的策略。 –

+0

@TimPietzcker我現在使用6個正則表達式來檢查其他需求。 – coferniecus

相關問題