如果你有有限的字符序列之后彼此您可以在输入上匹配使用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>
。
来源
2013-07-18 05:56:21
fge
正则表达式总是处理字符串。他们不知道字符的含义,例如他们不知道2是多于1 – stema
请将您的代码与未匹配的字符串以及应用正则表达式的位置一起发布。 – stema