次の文字列の原因PatternSyntaxException
:
Pattern.compile("*\\.*");
次の形式の名前を持つすべてのファイルをフィルタリングできるように、パターンを作成したいと考えています。"*.*"
どうやってやるの?
次の文字列の原因PatternSyntaxException
:
Pattern.compile("*\\.*");
次の形式の名前を持つすべてのファイルをフィルタリングできるように、パターンを作成したいと考えています。"*.*"
どうやってやるの?
名前に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 回以上繰り返される」と解釈されます。*
繰り返す文字がない状態で式を開始したため、例外がスローされました。
この*
文字は、コマンド ラインでファイル ワイルドカードとして使用される場合とは、正規表現では異なる意味を持ちます。Java パターンの正規表現構文の詳細については、http: //docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.htmlを参照してください。
これにより、一致させようとしているテキストが見つかります。
Pattern.compile(".*\\..*");
多分あなたは意味しました:
Pattern.compile("\\*\\.\\*");
そうでない場合、アスタリスクは「任意の文字」を意味します。
Pattern.compile(".*\\..*");
あなたは書く必要があります:
Pattern.compile("\\*\\.\\*");
*
正規表現では特別な意味 (0 個以上) があるためです。したがって、 でエスケープする必要があり\\
ます。
別の方法は次のとおりです。
Pattern.compile("[*][.][*]");
と の間に現れると、他の意味が*
失われる[
から]
です。
format のファイル名を解析したい場合は*.*
、これで十分です。
Pattern.compile(".+\\..+");
任意のファイル名 (拡張子がある場合とない場合があります) を一致させるには、次を使用できます。
Pattern.compile(".+(\\..+)?");
つまり、ドット「。」でファイルを除外したいということです。その名前で、これを使用します:
Pattern.compile("[^\\.]*\\.[^\\.]*")
Pattern.compile(".*\\/.*\\..*");
このパターンを使用してください。ドットを含むすべてのファイル名に一致します。アスタリスクは特殊文字です。これは、前に来るシンボル*
が 0 回以上になる可能性があることを意味します。そのため、前の文字なしで書くことはできません。
たとえば、ファイル名のC:/folder.1/folder.2/file.txt
パターンは次
.*
のように機能しC:/folder.1/folder.2
ます。/
\/
/
.*
file
.
\\.
.
.*
txt
.