次のコードを使用すると、エラーが発生しました。
Matcher matcher = pattern.matcher("/Date\(\d+\)/");
エラーは次のとおりです。
invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )
また、括弧内の値を('/Date\(\d+\)/');に変更しようとしました。成功せずに。
このエラーを回避するにはどうすればよいですか?
\次のように、文字をダブルエスケープする必要があります\\。
それ以外の場合Stringは、エスケープしようとしているかのように解釈されます(。
他の丸括弧と d も同様です。
実際、一致させたいテキストPatternを参照しているときに、ここでa を初期化しようとしているようです。pattern.matcherPattern
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.indexOfandを使用できます。textToMatch.contains
Javaで正規表現をエスケープするには、次を使用することもできますPattern.quote()