5

次の文字列の原因PatternSyntaxException:

Pattern.compile("*\\.*");

次の形式の名前を持つすべてのファイルをフィルタリングできるように、パターンを作成したいと考えています。"*.*"

どうやってやるの?

4

6 に答える 6

3

名前にa が含まれるすべての文字列に一致させる.には、次のようにします。

Pattern.compile(".*[.].*");

それを分解するには:

  • .*任意の数の任意の文字に一致
  • [.]ドットに一致します。(はい、\\.動作します)
  • .*任意の数の任意の文字に一致

デモ:

Pattern p = Pattern.compile(".*[.].*");

System.out.println(p.matcher("hello.txt").matches()); // true
System.out.println(p.matcher("hellotxt").matches());  // false

ドットが 1 つだけの文字列"."も一致することに注意してください。ドットの前後にいくつかの文字があることを確認するには、*+:に変更できます.+[.].+


あなたが得る理由PatternSyntaxException

演算子は、*「直前の文字が 0 回以上繰り返される」と解釈されます。*繰り返す文字がない状態で式を開始したため、例外がスローされました。

于 2012-02-08T14:05:37.220 に答える
1

この*文字は、コマンド ラインでファイル ワイルドカードとして使用される場合とは、正規表現では異なる意味を持ちます。Java パターンの正規表現構文の詳細については、http: //docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.htmlを参照してください。

これにより、一致させようとしているテキストが見つかります。

Pattern.compile(".*\\..*");
于 2012-02-08T14:04:18.097 に答える
0

多分あなたは意味しました:

Pattern.compile("\\*\\.\\*");

そうでない場合、アスタリスクは「任意の文字」を意味します。

Pattern.compile(".*\\..*");
于 2012-02-08T14:02:15.590 に答える
0

あなたは書く必要があります:

Pattern.compile("\\*\\.\\*");

*正規表現では特別な意味 (0 個以上) があるためです。したがって、 でエスケープする必要があり\\ます。

別の方法は次のとおりです。

Pattern.compile("[*][.][*]");

と の間に現れると、他の意味が*失われる[から]です。

format のファイル名を解析したい場合は*.*、これで十分です。

Pattern.compile(".+\\..+");

任意のファイル名 (拡張子がある場合とない場合があります) を一致させるには、次を使用できます。

Pattern.compile(".+(\\..+)?");
于 2012-02-08T14:03:45.107 に答える
0

つまり、ドット「。」でファイルを除外したいということです。その名前で、これを使用します:

Pattern.compile("[^\\.]*\\.[^\\.]*")
于 2012-02-08T14:03:59.170 に答える
0

Pattern.compile(".*\\/.*\\..*");このパターンを使用してください。ドットを含むすべてのファイル名に一致します。アスタリスクは特殊文字です。これは、前に来るシンボル*が 0 回以上になる可能性があることを意味します。そのため、前の文字なしで書くことはできません。
たとえば、ファイル名のC:/folder.1/folder.2/file.txtパターンは次
.*のように機能しC:/folder.1/folder.2ます。/
\//
.*file.
\\..
.*txt.

于 2012-02-08T14:04:02.123 に答える