我需要检查一个单独的类中的回文,但忽略非字母字符。因此,例如,如果写入r,a,d,a,r
,雷达仍然有资格我相信我可以使用正则表达式,但我不知道如何。
这是我到目前为止所拥有的,
public static boolean isNonAlpha(char c) {
return (c == '-' || c == '.' || c == ' ' || c == ')' || c == '(') || c == '<' || c == '>' || c == ',';
}
public static String checkInput(String test){
int startChar = 0;
int endChar = test.length() - 1;
while (startChar < endChar) {
if (test.charAt(startChar) != test.charAt(endChar)) {
System.out.println("Your word is not a palindrome.");
System.exit(0);
} else {
if (test.charAt(startChar) == test.charAt(endChar))
startChar++;
endChar--;
}
}
System.out.println("Your word is indeed a palindrome.");
return test;
}
我坚持如何合并我的isNonAlpha方法,或者如何使用正则表达式
答案 0 :(得分:2)
您可以将此模式与matches
方法一起使用(如果需要,可添加不区分大小写的选项):
(?:[^a-z]*([a-z])(?=.*(\1[^a-z]*\2?+)$))+[^a-z]*[a-z]?[^a-z]*\2
如果您想匹配单个字母,请在结尾处添加|[^a-z]*[a-z][^a-z]*
。
demo regexplanet (Java)
demo regex101
细节:
这个想法是从组1中字符串开头的每个字母逐个捕获,并在每个字母的前端检查相同的字母是否存在。捕获组2处于前瞻中并且在字符串的末尾捕获其自己的内容(来自先前的重复)和新字母。在每次重复时,捕获组2都会以新字母(以及其他不是字母的字符)增长。
(?: # repeated non capturing group
[^a-z]* # eventual other character before a letter
([a-z]) # the letter is captured in group 1
(?= # lookahead (to check the end of the string)
.*
(
\1 # backreference capture group1: the letter at the beginning
[^a-z]* # other characters
\2?+ # backreference capture group2: optional but possessive
# (that acts like a kind of conditional: if the group 2 already
# exists, it matches, otherwise not)
)
$ # anchor for the end of the string
)
)+
[^a-z]*[a-z]?[^a-z]* # an eventual letter in the middle
\2 # backreference capture group 2
(使用matches
方法,锚是隐含的。)