DOBON.NET DOBON.NETプログラミング掲示板過去ログ

正規表現?

  • 題名: 正規表現?
  • 著者: えるま
  • 日時: 2004/11/09 14:05:27
  • ID: 7243
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
分類:[.NET]

System.Text.RegularExpressions.Regexというのがよくわかりません。
簡単に説明してくれると助かります。

例えでいいのですので、教えてくれませんか?
ヘルプを見てもさっぱりわかりません。

Dim RG_a As Text.RegularExpressions.Regex
Dim MC_Text As System.Text.RegularExpressions.MatchCollection
Dim STR_a AS String

RG_a = New System.Text.RegularExpressions.Regex(−−−, System.Text.RegularExpressions.RegexOptions.Multiline)

STR_a = MC_Text.Item(0).Value

使い方はこんな感じお願いします。
※(−−−)はおまかせします。適当なモノを入れてください
答えるのはどうなのか、とも思いますが・・・
まぁ、ざっと。

textbox1(マルチライン)・textbox2(マルチライン)・button1を
貼ったフォームに以下を貼って試してみてください。
'───────────────────────────
  Private Sub Button1_Click(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles Button1.Click
    '画面にはtextbox1・textbox2・button1があるものとする。
    'テキストボックスは1が元データ、2が結果。

    '検証するテキスト例:
    '981-3203
    '101-0016
    '980
    'aaaaa
    '111-11111
    'aa
    'a123-4567

    '結果:
    '[981-3203]
    '[101-0016]


    '検証したいデータ(改行あり)
    Dim strs As String = Me.TextBox1.Text

    '検証用の表現のインスタンスを生成(複数行として検証するものとする)
    'Sharedメソッドもあるが、一応生成する方が個人的には扱いやすいので。

    'この例では、「数字3桁-数字4桁」のみで構成されている行、という日本の郵便番号パターン。
    'ただし、「郵便番号部分だけをjzipという名前で取得するように」との指示を含む。
    Dim rx As New System.Text.RegularExpressions.Regex("^((?<jzip>\d{3}-\d{4})(?:\s*))$", _
        System.Text.RegularExpressions.RegexOptions.Multiline)
    '複数の該当結果を受け取るコレクション
    Dim m As System.Text.RegularExpressions.MatchCollection
    '実際に検証を行って結果を受け取る
    m = rx.Matches(strs)
    '文字列組み立て用。別に候補が少ないのであればこんなもの使わずともstringの単純連結でよい。
    Dim rst As New System.Text.StringBuilder
    '該当数分ループして・・・
    For Each m1 As System.Text.RegularExpressions.Match In m
      'jzip部分のみを使用する。(m1.valueだと、マッチ全体になるので色々邪魔。)
      rst.Append("[" & m1.Groups("jzip").Value & "]" & vbCrLf)
    Next
    '結果テキストボックスに表示
    TextBox2.Text = rst.ToString


  End Sub
返信してくれてありがとうございます。
こど。さんのプログラムのおかげでわかるようになってきました。
少しわからないところがあるので質問させてください。

>Dim rx As New System.Text.RegularExpressions.Regex("^((?<jzip>\d{3}-\d{4})(?:\s*))$", System.Text.RegularExpressions.RegexOptions.Multiline)

のところで、郵便番号で例えてるようにTextBox1に"○○○-○○○○"の形式で書かれているものだけをjzipに格納するやり方ですよね?
デバッグモードで、コマンドウインドウを見るみたいに、頭に"?"を付けてjzipに格納するような書き方ですか?それともうひとつ、「(?:\s*))$"」というのは?(汗)なんでしょうか?
訂正

>頭に"?"を付けてjzipに格納するような書き方ですか?
頭に"?"を付けてjzipに検索すると同様なことことですか?
詳細はマニュアルで
ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1041/cpgenref/html/cpconregularexpressionslanguageelements.htm
(「正規表現言語要素」)
を見てください。よくまとまっているようなので。


> デバッグモードで、コマンドウインドウを見るみたいに
いや、別にVisualStudioの開発環境とは関係ないです。
MSの正規表現関連仕様での、拡張用の仕様です。
「グループ化構成体」という機能を使うための指示子もので、キャプチャする範囲等を細々と設定できます。

^((?<jzip>\d{3}-\d{4})(?:\s*))$

(?<jzip>\d{3}-\d{4})は、\d{3}-\d{4}の部分をjzipという名前付きグループとしてキャプチャする指示
(「?<名前>」で、名前付きでキャプチャする指示)、
(?:\s*)は、($の直前にあるので、行の最後の)ホワイトスペース文字(改行やタブ、スペース)の連続とマッチして、
それを破棄する指示(「?:」で、破棄)(ホワイトスペースは受け取りたくないので。)
^:行の先頭、$:行の終端
という感じです。

MSのマニュアル(上記)で、表や例付きで見やすく詳細にまとめてあるようなので、そちらをご覧ください。
こればっかりは、かいつまんで説明しても分からないので、自分でサンプルの小さなプログラムを
いくつか作って勉強するしかないと思います。
(.NETでの正規表現の仕様を勉強する必要があります。)
正規表現は覚えると便利なのでがんばってくださいね。
  • 題名: Re[5]: 正規表現?
  • 著者: えるま
  • 日時: 2004/11/11 9:01:45
  • ID: 7292
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
どうもありがとうございます。
とてもわかりやすく参考になりました。
正規表現についてはこれからも勉強していこうと思います。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板