1

正規表現を使用して読み取る必要のあるファイルがあります。文字列には、行が60文字以内であれば、基本的に何でも(大文字、小文字、スペース、記号など)含めることができます。私が試した方法は、ファイル内のほとんどの文字列で機能しますが、引用符も許可する必要があります。これは、行き詰まっている場所です。これが私がこれまでに試したことです。

    else if (data.matches("[A-Za-z0-9 ,.?!%&()@$-_:;\\\"]+$")
            && !label.equals("") && prompt.equals("") && data.length() <= 60)
        {
            prompt = data;
        }

次の文字列を除いて、他のすべてを正常に読み取ります

    Yes, but an error is displayed, “Fuser out.”

スペルについては聞かないでください、それは私が与えられたサンプルファイルにあったものでした。

助けてくれてありがとう。私はロングアイランドにいて、ハリケーンのおかげで家に電力もインターネットもないので、コインランドリーを出る前に返事が来ることを願っています。

4

4 に答える 4

2

以下のような正規表現を追加\"します。

  data.matches("[A-Za-z0-9 ,.?!%&()@$-_:;\"\\]+$")

\"使用される場合、"一致するリテラルとして使用されます。

于 2012-11-01T17:48:03.090 に答える
0

これはコードからのコピー&ペーストです

 "Yes, but an error is displayed, \"Fuser out.\"".matches("[A-Za-z0-9 ,.?!%&()@$-_:;\\\"]+$"));

そしてそれはtrueを返すので、それは大丈夫です。

しかし、コードからコピー&ペーストを行うと問題が発生します。文字列「Fuserout。」の「」という文字は、正規表現の「」とは異なる文字ですか?

于 2012-11-01T17:53:48.983 に答える
0

スマートクォートを使用しているため、おそらくその文字列の一致に問題があります。次の記事には、これに関するいくつかの良い情報があります:スマートな引用のための便利な正規表現

要約すると、次のUnicodeエスケープを使用して、これらの文字を正規表現に追加できます。

\u201C\u201D\u201E\u201F\u2033\u2036

さらに、現在\"、正規表現(\\\"Java文字列)で使用することにより、文字クラスで円記号と二重引用符の両方を許可する予定のようです。これはあなたが思っていることをしていません、あなたの正規表現\"のリテラル文字と一致するだけ"です、それはただ不必要なバックスラッシュを持っています。有効な文字として実際に円記号を含めるには、Java文字列に4つの連続した円記号が必要です。

また、ハイフンをエスケープする必要があります。そうしない$-_と、文字範囲として解釈されます。

したがって、新しい正規表現は次のようになります。

data.matches("[A-Za-z0-9 ,.?!%&()@$\\-_:;\\\\\"\\u201C\\u201D\\u201E\\u201F\\u2033\\u2036]+$")
于 2012-11-01T17:54:20.097 に答える
0

誰かが興味を持っているなら、これが私がそれを単純化することになった方法です。

    if (data.matches("\n"))
        {
            // do nothing, ignore
        }
        else if (data.matches("[^ ]+$") && label.equals("")
            && data.length() <= 60)
        {
            label = data;
        }

        else if (data.matches(".+$")
            && !label.equals("") && prompt.equals("") && data.length() <= 60)
        {
            prompt = data;
        }

        else if (data.matches(".+$")
            && !label.equals("") && !prompt.equals("") && message.equals("")
            && data.length() <= 60)
        {
            message = data;
        }

        else if (data.matches("[^ ]+[ ]+[0-9]$") && label.equals("")
            && prompt.equals("") && message.equals("") && data.length() <= 60)
        {
            children = data;
            String[] info = children.split("[ ]+");
            parent = info[0];
            numChildren = Integer.parseInt(info[1]);

            tree.getNodeReference(parent).setNumChildren(numChildren);
        }
于 2012-11-01T18:02:49.137 に答える