次のコードを使用すると、エラーが発生しました。
Matcher matcher = pattern.matcher("/Date\(\d+\)/");
エラーは次のとおりです。
invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
また、括弧内の値を('/Date\(\d+\)/')
;に変更しようとしました。成功せずに。
このエラーを回避するにはどうすればよいですか?
\
次のように、文字をダブルエスケープする必要があります\\
。
それ以外の場合String
は、エスケープしようとしているかのように解釈されます(
。
他の丸括弧と d も同様です。
実際、一致させたいテキストPattern
を参照しているときに、ここでa を初期化しようとしているようです。pattern.matcher
Pattern
Pattern
最後に、エスケープ文字では、次のように二重エスケープが必要であることに注意してください。
\\(\\d+\\)
また、Rohit が言うようにPattern
、Java の s はスラッシュ ( /
) で囲む必要はありません。
実際、そのように a を初期化すると、文字どおりのスラッシュで始まり、終わるものとしてPattern
解釈されます。Pattern
おそらくやりたいことの小さな例を次に示します。
// your input text
String myText = "Date(123)";
// your Pattern initialization
Pattern p = Pattern.compile("Date\\(\\d+\\)");
// your matcher initialization
Matcher m = p.matcher(myText);
// printing the output of the match...
System.out.println(m.find());
出力:
true
正規表現自体は正しいですが、Java ではバックスラッシュ文字自体をエスケープする必要があります。
したがって、この正規表現は次のとおりです。
/Date\(\d+\)/
これに変わる必要があります:
/Date\\(\\d+\\)/
1 つのバックスラッシュは、括弧または をエスケープするためのものd
です。もう 1 つは、バックスラッシュ自体をエスケープするためのものです。
Java は、 やその他の例の\(
ような単一のエスケープ文字として使用しようとしていると見なすため、表示されるエラー メッセージが表示されます。\n
ただし、\(
有効なエスケープ シーケンスではないため、Java は文句を言います。
さらに、コードのロジックが間違っている可能性があります。への引数matcher
は検索するテキスト (たとえば、"/Date(234)/Date(6578)/") である必要がありますが、変数pattern
にはパターン自体が含まれている必要があります。これを試して:
String textToMatch = "/Date(234)/Date(6578)/";
Pattern pattern = pattern.compile("/Date\\(\\d+\\)/");
Matcher matcher = pattern.matcher(textToMatch);
最後に、正規表現文字クラス\d
は「1 つの数字」を意味します。リテラル フレーズ を参照しようとしている場合は、これをエスケープするため\\d
に を使用する必要があります。\\\\d
ただし、その場合、正規表現は定数になり、より簡単にtextToMatch.indexOf
andを使用できます。textToMatch.contains
Javaで正規表現をエスケープするには、次を使用することもできますPattern.quote()