2013-07-18 45 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

相关问题