1

次のコードを使用すると、エラーが発生しました。

 Matcher matcher = pattern.matcher("/Date\(\d+\)/");

エラーは次のとおりです。

invalid escape sequence (valid ones are \b \t \n \f \r \" \' \\ )

また、括弧内の値を('/Date\(\d+\)/');に変更しようとしました。成功せずに。

このエラーを回避するにはどうすればよいですか?

4

3 に答える 3

5

\次のように、文字をダブルエスケープする必要があります\\

それ以外の場合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
于 2013-08-10T15:27:58.403 に答える
1

正規表現自体は正しいですが、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

于 2013-08-10T15:30:58.837 に答える
0

Javaで正規表現をエスケープするには、次を使用することもできますPattern.quote()

于 2013-08-10T23:09:50.067 に答える