0

^[a-zA-Z]+( [a-zA-z]+)*$これまでのところ、ユーザー入力の最初と最後にスペースがなく、数字や特殊文字を受け入れず、アルファベット文字のみを受け入れるようにするために使用してきました。

私は正規表現リストをオンラインで見ましたが、私のテキストでは、再帰的な回文プログラムのこれらの条件下では正規表現を定式化できないようです:

  • 大文字または小文字を含む文字列を受け入れます。
  • 句読点とシングル スペース ブランクを受け入れます。

検証後、次の正規表現は必要ないと思いますが、ある場合はそれが何であるか知りたいです。

  • 検証後、大文字は小文字に変換する必要があります。
  • 句読点とスペースは無視されます。
4

1 に答える 1

0

私の理解が正しければ、Java で正規表現を使用する再帰的な回文チェッカーを作成したいと考えていると思います。私は Java の学習に興味があるので、自分自身の「宿題」として試してみましたが、これはおそらくあなたの問題でもあるでしょう。

import java.lang.*;
import java.util.*;
import java.util.regex.*;

class Main
{
    public static boolean recursivePalindrome(String str)
    {
        // We need two patterns: one that checks the degenerate solution (a
        // string with zero or one [a-z]) and one that checks that the first and
        // last [a-z] characters are the same. To avoid compiling these two
        // patterns at every level of recursion, we compile them once here and
        // pass them down thereafter.
        Pattern degeneratePalindrome = Pattern.compile("^[^a-z]*[a-z]?[^a-z]*$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        Pattern potentialPalindrome  = Pattern.compile("^[^a-z]*([a-z])(.*)\\1[^a-z]*$", Pattern.CASE_INSENSITIVE | Pattern.DOTALL);
        return recursivePalindrome(str, degeneratePalindrome, potentialPalindrome);
    }

    public static boolean recursivePalindrome(String str, Pattern d, Pattern p)
    {
        // Check for a degenerate palindrome.
        if (d.matcher(str).find()) return true;

        Matcher m = p.matcher(str);

        // Check whether the first and last [a-z] characters match.
        if (!m.find()) return false;

        // If they do, recurse using the characters captured between.
        return recursivePalindrome(m.group(2), d, p);
    }

    public static void main (String[] args) throws java.lang.Exception
    {
        String str1 = "A man, a plan, a canal... Panama!";
        String str2 = "A man, a pan, a canal... Panama!";

        System.out.println(str1 + " : " + Boolean.toString(recursivePalindrome(str1)));
        System.out.println(str2 + " : " + Boolean.toString(recursivePalindrome(str2)));
    }
}

出力は次のとおりです。

A man, a plan, a canal... Panama! : true
A man, a pan, a canal... Panama! : false
于 2012-11-01T03:59:08.900 に答える