2016-07-15 10 views
2

文字列(基本的には正規表現自体)を小文字に変換したいが、メタキャラクタが変換されないようにしたい。すべてのメタ文字を除く文字列を小文字に変換する

:私は

String x = "[\\s\\S]*Test Message Indicator: (.*)[\\s\\S]*"; 
x = x.toLowerCase(); 

を行う

場合、それはまた、正規表現の意味を変更しますs\\Sに資本Sを変換します。

私はそれを避けたいです。

最終正規表現は[\\s\\S]*test message indicator: (.*)[\\s\\S]*とします。

これを簡単に行う方法はありますか?

+6

大文字と小文字を区別しないで使用できませんか? – shmosel

+2

は文字列関数ではありません。正規表現を意識したものが必要でしょうが、おそらくこれは起こりません。いくつかのlib正規表現をトークン化し、正規表現の "テキストノード"だけを扱うことができますが、そのようなものを見つけることは、このサイトの話題になりません。 –

+1

私は正規表現として見られるように値全体が意図されていない場合、あなたの値に正規表現をインライン化しないことをお勧めします。懸念を分離してください。それ以外の場合は、独自のパーサーを作成して、それを分解して値を抽出する必要があります。テンプレートの種類がないと非常に難しいでしょう。 –

答えて

1

正規表現の大文字の事前定義された文字クラスを入れ替えるプレースホルダ(入力文字列にないことがわかっている)を使用できます。たとえば、Unicodeのそれぞれの値00A000A1\Sため00A2\D、および\W(またはあなたが見たことがないために予想される方char値)、小文字の文字列に置き換え、そしてバック置き換える特殊文字で:

String x = "[\\s\\S]*Test Message Indicator: (.*)[\\s\\S]*"; 
x = x.replaceAll("\\\\S", "\u00A0").replaceAll("\\\\D","\u00A1").replaceAll("\\\\W","\u00A2");; 
x = x.toLowerCase(); 
x = x.replaceAll("\u00A0", "\\\\S").replaceAll("\u00A1","\\\\D").replaceAll("\u00A2","\\\\W");; 
System.out.println(x); 

これは、いくつかの一般的な大文字のクラスについてのみ説明します(コンテキストによっては非効率的かもしれません)。正規表現が複雑で可能なすべての大文字の正規表現値を考慮する必要がある場合はAPIを参照する必要があります。 。

+0

これはうまくいくかもしれませんが、すべての正規表現メタキャラクターを考慮する必要があります。 [ここに記載されている](https://docs.oracle.com/javase/8/docs/api/java/util/regex/Pattern.html#sum)などです。 – gregn3

+0

@ gregn3優秀な点があります。答えをより明示的に更新しました – copeg

+0

OPが複数回使用する予定の場合は、一般的な解決策になるはずです。 – gregn3

関連する問題