下記の ? は何の意味なのでしょうか?
r = New Regex( _
"<a\s+[^>]*href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))[^>]*>(?<2>[^<]*)", _
RegexOptions.IgnoreCase Or RegexOptions.Compiled)
http://www.atmarkit.co.jp/fdotnet/basics/regex01/regex01_04.html
“?”は「直前の要素(または1文字)が0個または1個あるときにマッチする」メタ文字である。“*”の機能を少し弱めたようなメタ文字で、2文字以上の連続にはマッチしない。
(? の場合は (が ある場合と ない場合の両方ということになります。
http://www4.ocn.ne.jp/~kaerume/k2e/regex_1.html
(?:...)
パターンの非格納グループ化
(?=...)
先読み
直前のパターンに続いて、このパターンが出現する物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。
(?!...)
否定先読み
直前のパターンに続いて、このパターンが出現しない物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。
(?#Text)
コメント
コメントです。この中の物は無視されます。マッチに影響は与えません。
この中では‘)’をエスケープすることは出来ません。
<a\s+[^>]*href\s*=\s*
上記の部分は問題ないですよね。省略します。
(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))
ここが難しいと思います。
まず、最初の (?: と最後の ) は内容を単純にグルーピングするための括弧です。
この括弧にマッチした内容をメモリに保存しない時に使います。
さらに分解してこの括弧の中身の説明に移ります。
""(?<1>[^""]*)""|(?<1>[^\s>]+)
ここで一番強い演算子は | です。
OR という意味ですので、" | の前、または | の後"という意味になります。
それぞれ説明します。
""(?<1>[^""]*)""
VB系ではダブルクォートが特殊な意味を持ちますので、エスケープしています。
意味はダブルクォートで始まり、括弧部分、ダブルクォートで終わるもの、となります。
(?<1>[^""]*)
この部分が一番気になっている部分だと思いますが、これは<>内のグループ名で内容を保存する括弧になります。
つまり 1 という名前で [^""]* を保存します。
[^""]* はダブルクォートではない文字の0文字以上の繰り返しです。
この内容はMatch.Groups(1)で後から参照できます。
[参考URL]
| の後半部分に移ります。
(?<1>[^\s>]+)
この部分は、空白文字、大なり記号ではない文字列の1文字以上の繰り返しを 1 という名前で保存する、という意味です。
これで前半部分は終了です。後は同じ考え方で意味を理解できると思います。
[^>]*> は大なり記号ではない文字の0文字以上の繰り返しの後、大なり記号、という意味です。
(?<2>[^<]*)
この部分は 2 という名前で小なり記号ではない文字の0文字以上の繰り返しを保存します。
この内容はMatch.Groups(2)で後から参照できます。
参考になれば幸いです。
( ってそういう意味ですか?
() でセットなのかと思っていましたが・・