我的学生(高中)问我一个关于正则表达式匹配包含按字母顺序排列的字母的单词的问题。老实说,我不知道如何创建这样的正则表达式。单词匹配示例,字母大小无关紧要:
abc, aWZ, gOR, bor
^a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$
应该管用
这应该有效:
(?i)a*b*c*...z*
在循环中构建很容易。
StringBuilder b = new StringBuilder(64);
b.append("(?i)");
for (int i = 'a'; i <= 'z'; i++) b.append((char)i).append('*');
return Pattern.compile(b.toString()).matcher(input).matches();
对于正则表达式来说,这并不是一个真正的好问题,在 for 循环中检查它几乎肯定更容易:
import static java.lang.Character.isLetter;
import static java.lang.Character.toLowerCase;
public boolean alphabeticalOrder(String word) {
for (int i = 0; i < word.length() - 1; i++) {
if (!isLetter(word.charAt(i)) ||
toLowerCase(word.charAt(i + 1)) < toLowerCase(word.charAt(i)))
return false;
}
return isLetter(word.charAt(word.length() - 1));
}
或者,以下正则表达式在传入时也将正确匹配(仅适用于 ASCII 字母字符)CASE_INSENSITIVE
:
^a*b*c*d*e*f*g*h*i*j*k*l*m*n*o*p*q*r*s*t*u*v*w*x*y*z*$