Java RegExメタ文字(。)と通常のドット?


150

Java RegExで、.文中で使用されているメタ文字(ドット)と通常のドットの違いを見つける方法。あまりにも(のような他のメタ文字のためにこのような状況に対処する方法*+\d、...)

回答:


276

正規表現で特別な意味を持つドットまたはその他の文字を通常の文字にしたい場合は、バックスラッシュでエスケープする必要があります。Javaの正規表現は通常のJava文字列なので、バックスラッシュ自体をエスケープする必要があるため、2つのバックスラッシュが必要です。\\.


1
この修正はbashにも適用されます
krivar '13

18
バックスラッシュをエスケープするかどうかは、正規表現を指定する方法に依存することに注意してください。ハードコードされている場合は、「\\」を使用する必要があります。、生のソース(テキストファイルなど)から読み取る場合は、単一のバックスラッシュ\のみを使用します。
ポール

25

他のメンバーから提案された解決策は私にはうまくいきません。

しかし、私はこれを見つけました:

Java正規表現でドットをエスケープするには [.]


2
同じ、\\.私のために動作しませんでした:\.その訴え.、エスケープする必要はありません\\.、それはそれだったと思う製\.の代わりに.\\\.およびエラー投げビルダー、[.]働いていた唯一のものでした。
mithunc、2018年

1
@mithunc奇妙なことに\\.、文字列リテラル内\.では、正規表現が任意の文字のマッチャーではなくリテラルドットとしてドットを表示するために必要な正規表現が提供されます。
klaar 2018

16

Perlスタイルの正規表現(Java正規表現エンジンは多かれ少なかれ基づいている)は、次の文字を特殊文字として扱います。

.^$|*+?()[{\文字クラス以外の特別な意味を持つ

]^-\文字クラスの内部では特別な意味あります([...])。

したがって、コンテキストに応じてこれらの(そしてそれらのみの)シンボルをエスケープする必要があります(または、文字クラスの場合は、誤って解釈されない位置に配置します)。

不必要に他の文字をエスケープすることもできますが、一部の正規表現エンジンはこれを構文エラーとして扱い\_ます。たとえば、.NETでエラーが発生します。

たとえば、Perlでは\<リテラルとして解釈されます<が、egrep「単語の境界」を意味します。

書き込みだから、-?\d+\.\d+\$試合に1.50$-2.00$などと[(){}[\]]かっこ/括弧/括弧のすべての種類に一致する文字クラスについて。

ユーザー入力文字列を正規表現に安全な形式に変換する必要がある場合は、を使用してくださいjava.util.regex.Pattern.quote

参考資料メタキャラクターのエスケープに関するJan GoyvaertのブログRegexGuru


4

特殊文字をバックスラッシュでエスケープします。\.\*\+\\d、とのようにします。よくわからない場合は、特殊文字であるかどうかに関係なく、アルファベット以外の文字をエスケープできます。詳細については、javadocのjava.util.regex.Patternを参照しください。


特殊文字以外の文字を不必要にエスケープすると、一部の言語では機能する可能性がありますが、他の言語では失敗する可能性があるため、習慣にならないようにしてください。
Tim Pietzcker

1
ただし、この質問は特にJavaに関するものであり、docs.oracle.com / javase / 6 / docs / api / java / util / regex / は「アルファベット以外の文字の前に、その文字がエスケープされていない構造の一部です。」
ChristofferHammarström2015

2

ここに、直接コピーして貼り付けることができるコードがあります:

String imageName = "picture1.jpg";
String [] imageNameArray = imageName.split("\\.");
for(int i =0; i< imageNameArray.length ; i++)
{
   system.out.println(imageNameArray[i]);
}

そして、誤って「。」の前後にスペースが残っているとどうなるでしょうか。そのような場合?これらのスペースも考慮することが常にベストプラクティスです。

String imageName = "picture1  . jpg";
String [] imageNameArray = imageName.split("\\s*.\\s*");
    for(int i =0; i< imageNameArray.length ; i++)
    {
       system.out.println(imageNameArray[i]);
    }

ここで、\\ s *はスペースを考慮して、必要な分割文字列のみを提供するためのものです。


1

「。*」で終わる文字列に一致させたいので、次のように使用する必要がありました。

"^.*\\.\\*$"

あなたがそれについて考えるならば、ちょっとばかげています:Dそれが意味することをここに示します。文字列の先頭には、0個以上の任意の文字の後にドット「。」を続けることができます。文字列の最後に星(*)が続きます。

これが誰かにとって重宝すると思います。Fabianにバックスラッシュを付けてくれてありがとう。


そのまま使用してください"\\.\\*$"。関係がない場合は、文字列の先頭を照合する必要はありません。
オフィディアン

はい。それで合っています。正直なところ、このユースケースを
思い出せません

本当にあなたを助けるためではなく、あなたの投稿を見ている他の人を助けるためでした:P
オフィディアン

0

終了する場合は、文が「。」で終了するかどうかを確認してください。パターンの最後に[\。\ ] $を追加する必要があります。


0

私はJGraspでいくつかの基本的な配列を行っていますが、char [] []配列が単一のドットを配置するために使用する( '。')のアクセサーメソッドを使用していることがわかりました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.