VB.NET の正規表現を勉強しています。


下記の ? は何の意味なのでしょうか?

r = New Regex( _
"<a\s+[^>]*href\s*=\s*(?:""(?<1>[^""]*)""|(?<1>[^\s>]+))[^>]*>(?<2>[^<]*)", _
RegexOptions.IgnoreCase Or RegexOptions.Compiled)

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2006/12/07 15:00:06
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:taknt No.1

回答回数13539ベストアンサー獲得回数1198

ポイント27pt

http://www.atmarkit.co.jp/fdotnet/basics/regex01/regex01_04.html

“?”は「直前の要素(または1文字)が0個または1個あるときにマッチする」メタ文字である。“*”の機能を少し弱めたようなメタ文字で、2文字以上の連続にはマッチしない。

(? の場合は (が ある場合と ない場合の両方ということになります。

id:yamazakiis

( ってそういう意味ですか?

() でセットなのかと思っていましたが・・

2006/11/30 15:06:45
id:taknt No.2

回答回数13539ベストアンサー獲得回数1198

ポイント27pt

http://www4.ocn.ne.jp/~kaerume/k2e/regex_1.html

(?:...)

パターンの非格納グループ化

(?=...)

先読み

直前のパターンに続いて、このパターンが出現する物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。

(?!...)

否定先読み

直前のパターンに続いて、このパターンが出現しない物がマッチします。ただし、このパターン自体はマッチ文字列には含まれません。

(?#Text)

コメント

コメントです。この中の物は無視されます。マッチに影響は与えません。

この中では‘)’をエスケープすることは出来ません。

id:bonlife No.3

回答回数421ベストアンサー獲得回数75

ポイント26pt

<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)で後から参照できます。

参考になれば幸いです。

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません