2009-06-15 14 views
5

私はエルヴィス(エクリプス検索を使用して)を見つけることを任されています。私が彼を見つけるために使用できる正規表現はありますか?エルヴィスを見つける?:

"Elvis Operator"(?:)は、Javaの3進演算子を短縮したものです。

私は\?[\s\S]*[:]を試しましたが、複数行に一致しません。
エルヴィスをif-elseブロックに変更できるリファクタリングはありますか?

+3

これはGroovyですか?もしそうなら、それが本当に助けになるでしょう。 (これは本当にJavaの条件演算子です.btw - "ternary"は、どれくらいのオペランドが記述されているかを表しています。* a * 3進演算子で、現在は唯一のものですが、その名前は条件演算子です) –

+7

Jon SkeetはElvisです。 – abmv

+0

Groovy参照を見ると、バイナリ演算子のvalue:?を呼び出します。 value 'Elvis演算子、および三項演算子' boolean? value:value 'a'伝統的な三項演算子です。 Elvis演算子、または条件演算子について話していますか? Elvis演算子の場合は、「?:」を検索することができます –

答えて

4

編集 あなたの問題は、あなたがこれを使用することができ、複数行の場合は申し訳ありませんが、私は、三項演算子のための正規表現を掲載していた:

\?(\p{Z}|\r\n|\n)*:
+2

String hello = "私は 'エルヴィスオペレーター'ではありませんか?確かに、わかりません。 – workmad3

+8

「わかっています、私は正規表現を使用します! 2つの問題がありました... –

+0

文字列bbcode = "Huh?:confused:" – Svante

2

をあなたがしたい場合は、明示的に行区切り文字を一致させる必要があります複数の行にまたがって一致します。 \ Rは、いずれにしてもEclipse 3.4のいずれか(プラットフォームに依存しません)と一致します。あるいは、あなたのファイル(\ r、\ n、\ r \ n)に適切なものを使用できます。例えば。 \?.*\R*.*:は、改行が1つしかない場合に機能します。しかし、\ Rを文字クラスで使うことはできません。そのため、演算子の行数がわからない場合は、行区切り文字と文字クラスを作成しなければなりません。オペランド。 ([-\r\n\w\s\[\](){}=!/%*+&^|."']*)\?([-\r\n\w\s\[\](){}=!/%*+&^|."']*):([-\r\n\w\s\[\](){}=!/%*+&^|."']*)のようなものです。私は、あなたが見つけて置き換えることができるように、オペランドをグループとしてキャプチャするために括弧を付けました。

これはJava(とおそらく他の言語)でもかなり大きな問題があります。三項条件付きの?:演算子は式を作成し、if文は式ではありません。検討してください:

boolean even = true; 
int foo = even ? 2 : 3; 
int bar = if (even) 2 else 3; 

3行目は構文的に間違っています。 2つの条件付き構成は同等ではありません。 (正規表現を使用して見つけて置き換えるのであれば、実際には2番目の行から何を得るのですか?

したがって、?:演算子は上記の正規表現で見つけることができます。私はあなたがクラスに含める必要があるいくつかの文字を見逃している可能性があります)、あなたは必ずそれらをif文で置き換えることはできません。

+0

int foo = even? 2:3; 'のようなものにリファクタリングする必要がありますif(even){int foo = 2; } else {int foo = 3; }; 'ほとんどのC言語のように。 – Svante

+0

@Swante fooの範囲は間違っていると思います。あなたはif/elseの外でそれを使用することはできません – David