在检查回文时,如何忽略空格,标点符号以及与字母不同的所有字符?

时间:2016-02-28 22:12:22

标签: java regex string palindrome

我需要检查一个单独的类中的回文,但忽略非字母字符。因此,例如,如果写入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方法,或者如何使用正则表达式

1 个答案:

答案 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方法,锚是隐含的。)