以下が機能することは知っていますが、それほど読みやすくはありません。コメントを追加せずにコード自体を読みやすくする方法はありますか?
//Start her off
String sampleregex = "\\\\";
if (input.matches(sampleregex))
//do something
//do some more
以下が機能することは知っていますが、それほど読みやすくはありません。コメントを追加せずにコード自体を読みやすくする方法はありますか?
//Start her off
String sampleregex = "\\\\";
if (input.matches(sampleregex))
//do something
//do some more
なぜだめですか
if (input.contains("\\")) {
}
あなたは単にバックスラッシュを探しているように見えるので?
"\\\\"
代わりに"////"
次のことを意味すると仮定します。
\Q
andでエスケープできます\E
。これにより、バックスラッシュの 1 つのレイヤーが削除されます:"\\Q\\\E"
が、それほど優れているわけではありません。Pattern.quote("\\")
実行時にエスケープするために使用することもできます。しかし、個人的には、私はそのままでいいと思い"\\\\"
ます。
(余談ですが\
、正規表現エンジンとJava文字列の両方でエスケープするために使用されるため、4つ必要です。したがって、一度エスケープする必要があるため、正規表現エンジンは、他のものをエスケープしようとしていないことを認識します(つまり\\
) ; 次に、文字列内の何かをエスケープしていないことを Java が認識できるように、これらの両方をエスケープする必要があります (つまり\\\\
))。
/
は正規表現メタ文字ではないため、正規表現文字列"/"
は 1 つのスラッシュに"////"
一致し、4 つ続けて一致します。
スラッシュではなく、単一のバックスラッシュの一致について質問するつもりだったと思います。その場合、いいえ、"\\\\"
単一のバックスラッシュに一致するように正規表現文字列リテラルを入力する必要があります。(そして、SO に 4 つを表示させるために 8 つを入力する必要がありました。くそっ!)
私の解決策は Soldier.moth のものに似ていますが、ひねりがあります。一般的な正規表現を含む定数ファイルを作成し、追加し続けます。定数としての式を組み合わせて、正規表現を構築するための抽象化のレイヤーを提供することもできますが、最終的には、依然として厄介な結果になることがよくあります。
public static final String SINGLE_BACKSLASH = "\\\\";
私が考えた1つの解決策は、
String singleSlash = "\\\\";
if(input.matches(singleSlash))
//...
変数と定数に適切な名前を使用し、それらを段階的に構成することは、コメントなしで行うのに適した方法です。次に例を示します。
final string backslash = "\\";
final string regexEscapedBackslash = backslash + backslash;
if (input.matches(regexEscapedBackslash)) {
...