2011-07-05 12 views
46

:(「コロン」)は、正規表現 に特別な意味を持っているしかし、私はあるとしてそれを使用する必要があり、[A-Za-z0-9.,-:]* ように私はそれを脱出しようとしたが、これは動作しません[A-Za-z0-9.,-\:]*正規表現に ":"( "コロン")を入力するには?

+4

エスケープのために2つのバックスラッシュが必要なのでしょうか? – Mehrdad

+0

あなたは何を試そうとしていますか? –

答えて

86

ほとんどの正規表現の実装(Javaを含む)では、:には特別な意味はなく、文字クラスの内側と外側の両方に特別な意味はありません。

あなたの問題は、実際にあなたのクラスの範囲演算子として-行為最も可能性が高いです:,-:','':'間のすべてのASCII文字に一致し

[A-Za-z0-9.,-:]* 

。ただし、それでも文字通り':'と一致します。

代わりにこれを試してみてください:

[A-Za-z0-9.,:-]* 

開始またはクラスの終わりに-を配置することにより、それは文字通り"-"と一致します。 Keoki Zeeのコメントで述べたように、クラス内で-から脱出することもできますが、ほとんどの人は最後に追加するだけです。

デモ:

public class Test { 
    public static void main(String[] args) { 
     System.out.println("8:".matches("[,-:]+"));  // true: '8' is in the range ','..':' 
     System.out.println("8:".matches("[,:-]+"));  // false: '8' does not match ',' or ':' or '-' 
     System.out.println(",,-,:,:".matches("[,:-]+")); // true: all chars match ',' or ':' or '-' 
    } 
} 
+2

ハイフンをバックスラッシュ '[a \ -z]'でエスケープすることもできます。 –

+1

@Keoki:真実ですが、できるだけエスケープしないようにするのはより明確です(Javaの文字列リテラル内で二重にエスケープします)。それでも、それをエスケープすることはもちろんです。 –

+3

最後にハイフンを置くことは、おそらく以前のプログラマーが行ったことであり、これがこのエラーにつながりました。私は*常に*エスケープする:サイクルを終わらせる ':)' – Kobi

4

コロンがありません。文字クラス内で特別な意味を持ち、エスケープする必要はありません。 the PHP regex docsによると、文字クラスにエスケープする必要がある唯一の文字は次のとおりです。

(開始時)^-\以外のすべての英数字以外の文字と 終了]です 文字クラスでは特別ではありませんが、エスケープされている場合は、 になることはありません。

Java正規表現の詳細については、the docsを参照してください。

+0

私はなぜこれがdownvoteを持っているのか分からない、誰かが私にこの答えで間違っているかもしれないことを説明することができますか? –

+2

私は投票しませんでしたが、Java正規表現の質問にPHP regexのドキュメントをリンクしているためでしょうか? – hcpl

1

\:の代わりに\\:を使用してください。\は、Java文字列で特別な意味を持ちます。

+2

バックスラッシュはJava文字列のエスケープ文字ですが、ここでバックスラッシュをエスケープしても問題は解決しません。なぜなら ':'は正規表現の特別な文字ではないからです。 –

7

は注意してください、-は正規表現で特別な意味を持っています。 []では、最後にが置かれていれば、問題なくを置くことができます。あなたのケースでは、,-:から,から:までとなります。

関連する問題