11

次の問題が発生しました(簡略化)。私は次のように書いた

Pattern pattern = Pattern.compile("Fig.*");
String s = readMyString();
Matcher matcher = pattern.matcher(s);

1 つの文字列を読み取る際に、"Fig" で始まっていても、マッチャーは一致しませんでした。文字列の次の部分にある不正な文字まで問題を突き止めました。からのcodePoint値1633を持っていました

(int) charAt(i)

しかし、正規表現と一致しませんでした。入力プロセスのどこかで非 UTF-8 エンコーディングが原因だと思います。

Javadocは次のように述べています。

事前定義された文字クラス。任意の文字 (改行文字と一致する場合と一致しない場合があります)

おそらく、これは厳密な意味での文字ではありませんが、文字列の一部です。この問題を検出するにはどうすればよいですか?

更新: 見つけにくい (char)10 が原因でした。上記の私の診断は間違っています。以下のすべての回答は、尋ねられた質問に関連しており、役に立ちます。

4

4 に答える 4

13

これを確認するのは簡単です:

import java.util.regex.*;

public class Test {
    public static void main(String[] args) {
        Pattern pattern = Pattern.compile(".");
        for (char c = 0; c < 0xffff; c++) {
            String text = String.valueOf(c);
            if (!pattern.matcher(text).matches()) {
                System.out.println((int) c);
            }
        }
    }
}

私のボックスでは、出力は次のとおりです。

10
13
133
8232
8233

これらのうち、10 と 13 はそれぞれ「\n」と「\r」です。133 (U+0085) は「次の行」、8232 (U+2028) は「行区切り」、8233 (U+2029) は「段落区切り」です。

ご了承ください:

  • これは、基本的な多言語面以外の Unicode 文字をテストしません。
  • デフォルトのオプションのみを使用します
  • あなたのキャラクター 1633 (U+0661) の経験と矛盾しているようです。
于 2013-04-22T15:01:34.720 に答える
11

.Java 正規表現の文字は、パターンをコンパイルするときにフラグを使用しない限り、行末記号を除くすべての文字と一致します。Pattern.DOTALL

そのためには、次のようなパターンを使用します。

Pattern p = Pattern.compile("somepattern", Pattern.DOTALL);
于 2013-04-22T15:01:10.770 に答える
1

正規表現の非印刷文字の操作については、次の 2 つの記事を参照してください。

  1. 印刷できない文字を正規表現と一致させる方法
  2. 正規表現で Unicode コード ポイント、プロパティ、ブロック、およびスクリプトを使用する方法

UTF で正確に作業する場合でも、多くの驚きがあります。

于 2013-04-22T15:07:54.727 に答える