0

私はJavaと正規表現が初めてです。以下のこの正規表現を見てきましたが、理解できないようです。これは単にセッションキーを取得するためのものであり、誰かが私に説明してくれることを願っています.

URLはこちら

URL: http://somewebsite.com/signin?SessionKey=HDGshCWo3J0000000ED6

ここにコードがあります

String sessionKey = url.replaceAll("^.*SessionKey=([^&]*).*$", "$1");
System.out.println(sessionKey);

結果

HDGshCWo3J0000000ED6

私の質問は以下の正規表現についてです

^.*SessionKey=([^&]*).*$
  1. の目的は何ですか。(任意の文字) および *(0 回以上一致) ^ の後
  2. ^SessionKey= だけを使用しない理由
  3. ([^&]*) - ここでグループ化が使用される理由と & とは?
  4. .*$ - 使用する理由 . および * 行末の前?

交換用

  1. $1 - $1 とは何ですか?

ありがとう。

4

3 に答える 3

1

正規表現で^.*SessionKey=([^&]*).*$

1) の目的は何ですか。(任意の文字) および *(0 回以上一致) ^ の後

^.は式の開始を意味し、 の先頭に一致しStringます。これにより、SessionKey単語の前のすべてが許可されます。

2) ^SessionKey= を使用しない理由

上で説明した。これは、 の前に単語を許可しませんSessionKey

3) ([^&]*) - ここでグループ化が使用される理由と & とは?

&はリテラル&です。この部分は、リテラルが見つかるまですべてに一致します&。値を取得できるようにグループ化が使用されます$1(以下で説明します)。

4) .*$ - 使用する理由 . および * 行末の前?

.*$は基本的に の後&から の最後まですべてを無視しますString

$1 - $1 とは何ですか?

これは、最初のグループが一致したことを意味します。正規表現では、最初の 内で一致するコンテンツ()、つまり です[^&]*

于 2013-05-17T14:15:41.540 に答える
0

他の回答は、正規表現がどのように機能するかという主な質問をカバーしているので、それらを繰り返すつもりはありません.

SessionKeyキーがクエリ文字列に見つからない場合、コードは元の文字列を返すことに注意してください。

もう 1 つの潜在的な問題は、 という名前のキーがある場合SecondarySessionKey、URL 内の位置によっては、 のSecondarySessionKey代わりに の値を取得する可能性があることですSessionKey

より安全な方法は、URLorURIクラスを使用してクエリ文字列を選択し、クエリ文字列を解析することです。

于 2013-05-17T14:37:16.443 に答える
0
String sessionKey = url.replaceAll("^.*SessionKey=([^&]*).*$", "$1");

"^.*SessionKey=([^&]*).*$"の一致を、最初にキャプチャされたグループ$1である に置き換え([^&]*)ます。

あなたの質問:

  1. .*は基本的に、 までのすべての文字に一致します。例として、コンテキストで使用された場合に一致するSessionkeyものを見つけます。その目的は、必要な値を抽出する方法がわかるまで、クエリ文字列に含まれる可能性のあるすべての文字を消費することです。.*"no hello"(.*)helloSessionKey
>>> grep(r'(.*)hello','no hello')
['no ']
  1. ^SessionKey=SessionKey=フォームのクエリ文字列が必要^です。アンカーは、文字列の先頭を調べることを意味します。通常のクエリ文字列は次のようになりますwww.site.com/somewith?...
  2. ([^&]*)here は、 ではないものに一致するために使用され&ます。a^が文字クラス の最初の文字として見つかった場合、クラス[...]にあるものの反転を意味するため、 以外のすべて[^&]一致します。これは、セッション キーの値を取得するために使用されます。 &
  3. .*$セッションキーの値の後に残った文字を消費します。

式全体からのキャプチャ$1は、文字列sessionKeyをそれ自体に置き換えます。その結果、sessionKey は次のキャプチャと等しくなります。([^&]*)

于 2013-05-17T14:22:48.270 に答える