1

スラッシュ (/) 文字が続かない場合にのみ文字列と一致する正規表現が必要で、文字列全体と一致させたい。

たとえば、以下の文字列は一致する必要があります

/Raj/details/002-542545-1145457

しかし、これではありません

/Raj/details/002-542545-1145457/show

this answerで指定されているように、これを達成するためにNegative Lookaheadを使用しようとしました。

私のコードはこのようなものです。

pattern = Pattern.compile("/.*/details/(?!.*/)");
matcher = pattern.matcher(text);
if(matcher.matches()) {
  System.out.println("success");
} else {
System.out.println("failure");
}

失敗を与えています。しかし、私が使用matcher.find()すると、成功しています。

これを達成するための正規表現と一致しない理由を理解するのを手伝ってください。

4

3 に答える 3

3

これ

^/[^/]+/details/[^/]+$

一致します

/Raj/details/002-542545-1145457

だがしかし

/Raj/details/002-542545-1145457/show
于 2012-11-16T12:28:03.040 に答える
1

あなたの正規表現は、あなたが期待していることをしていないと思います。の後の数値データを取得する式の一部が欠落しています/details/

.find()現在の式の文字列内に一致があるため、正規表現は正ですが、文字列は式と完全には一致しないため、.matches()機能しません。

現在の式は貪欲な検索ではありません。 に到達するとすぐに一致が停止し/details/ます。/afterがあると一致に失敗するため、と/details/の間の文字が一致しません。例では、数値データです。肯定的な一致がまだあるにもかかわらず、失敗する原因となります。/details//.matches()

数字までの文字列全体を一致させ、その後は何も一致させたくない場合は、次の正規表現が機能する/.*/details/[0-9\-]*(?!.*/)はずです。.find().matches()/

于 2012-11-16T12:23:23.140 に答える
0

正規表現は問題ないようです。matcher()文字列全体にのみ一致しfind()ますが、文字列内の次の部分文字列に一致します。

于 2012-11-16T12:19:32.543 に答える