[[なでしこ&葵まとめ>Nadeshiko_programming4JapaneseStyle]]に戻る

日本語プログラミング言語「なでしこ」で正規表現を使う場合のメモ。

#contents

*正規表現とは [#i9d7d8d8]

正規表現(Regular Expression)とは、文字列(テキスト)が特定の条件と合っているか(マッチ)を判断する、その判定条件(パターン)の表記法こと。同じようなテクニックに、ファイル名などを指定する[[ワイルドカード:http://e-words.jp/w/E383AFE382A4E383ABE38389E382ABE383BCE38389.html]]というのがあるけれど、それの高機能版。

たとえば、膨大な文書から電話番号だけを取り出したい、なんてときに使える。

条件一致だけじゃなく、検索や置換にも使う。ソフトウェア開発などで幅広く利用されており、ソースコードの中でも使われるし、テキストエディタやテキスト検索などのプログラミングツールでも採用されている。

たぶん、プログラミングの基本として理解しておく必要がある。

*なでしこの正規表現入門 [#q8470b4a]

ここでは[[日本語プログラミング言語「なでしこ」:http://nadesi.com/]]での、正規表現のサンプルコードを示します。なでしこの正規表現は、Perl互換になっているとか。

**単純なマッチ [#y886cb4d]

 例文1 = 「海は広いな。大きいな。」
 例文1を「海」で正規表現マッチ。
 それを表示する。	# => 海

 例文1 = 「海は広いな。大きいな。」
 もし、(例文1を「海」で正規表現マッチ)ならば
 	「マッチしました」を表示する。
 違えば
 	「マッチしません」を表示する。# => マッチしました

 例文1 = 「海は広いな。大きいな。」
 もし、(例文1を「空」で正規表現マッチ)ならば
 	「マッチしました」を表示する。
 違えば
 	「マッチしません」を表示する。# => マッチしません

と、これだけだと文字列検索と同じになってしまう。

**簡単なパターン [#m91afc1d]

そこで、一致させたい文字列のパターンを指定する。たとえば、任意の電話番号(xxx-xxxx-xxxx)とか、郵便番号とか。

 電話番号の場合 
 \d{2,4}-\d{2,4}-\d{4}

 郵便番号(7桁)の場合
 \d{3}-\d{4}

**正規表現にマッチする行だけを表示する [#a47d0dd3]

一番よく使うパターンかも。ここでは、先頭が「#」の行を取り出す。

 #正規表現のテスト
 
 テスト文=「あああああ
 #いいいいい
 ううううう」
 
 パターン=「\A#」
 
 テスト文を反復
 	対象をパターンで正規表現マッチ
 	もし、それが空でなければ、
 		対象を表示


これを実行すると、次のようになる

 #いいいいい

**URLを検出する [#ub8fd165]

 リンク=「((mailto|http|https):[\x21-\x7E]*)」
 
 テスト1=「ここにhttp://nadesi.com/と書いておきます。」
 テスト1をリンクで正規表現マッチ
 それを表示  #http://nadesi.com/
 
 テスト2=「今度はhttps://nadesi.com/と書いておきます。」
 テスト2をリンクで正規表現マッチ
 それを表示  #https://nadesi.com/
 
 テスト3=「ここにmailto:foo@nadesi.comと書いておきます。」
 テスト3をリンクで正規表現マッチ
 それを表示  #mailto:foo@nadesi.com

**URLをリンクに変換 [#o9a7ba95]

 #URL変換6
 
 リンクタグ=「\[\[.+?\]\]」
 リンク=「((mailto|http|https):[\x21-\x7E]*)」
 
 本文=「ここはhttp://nadesi.com/aaaとhttp://nadesi.com/?aaaです。
 今度はhttps://nadesi.com/と書いておきます。
 ここにmailto:foo@nadesi.comと書いておきます。」
 
 抽出文=本文からリンクで正規表現全抽出2
 変換後文=本文のリンクを「\x01$1\x01」へ正規表現置換 
 
 抽出文を反復
 	リンク文=それ
 	リンク変換文=リンク文をリンク変換
	変換後文=変換後文の「{リンク文}」をリンク変換文へ単置換
 # 	変換後文=変換後文の「\x01{リンク文}\x01」をリンク変換文へ正規表現単置換
 #	正規表現のメタ文字「?」がURLに含まれる場合でも、リンクに変換
 #	正規表現での\x01は、単置換でに対応する
 
 変換後文を表示
 
 
 ●リンク変換(変換文を)
 
 	変換文を「(http|https):[\x21-\x7E]*」で正規表現マッチ
 	もし、それが空でなければ、
 		リンク表現=「<a href="{それ}">{それ}</a>」
 		リンク表現で戻る
 
 	変換文を「(mailto):[\x21-\x7E]*」で正規表現マッチ
 	もし、それが空でなければ、
 		リンク表現=「<a href="{それ}">{それ}</a>」
 		リンク表現で戻る
 
 //対象文からパターンをすべて抽出
 //マッチした数が1個の場合は戻値を返す
 //http://www26.atwiki.jp/isoroku_be/pages/44.html
 ●正規表現全抽出2(対象文からパターンで)
 	正規表現修飾子は「gmk」
 //マッチした数を計算
 	対象文2=対象文
 	対象文2=対象文2の「(●)」を「※」に正規表現置換
 	対象文2=対象文2のパターンを「●」に正規表現置換
 	マッチ数=対象文2で「●」の出現回数
 //抽出
 	戻値とは文字列
 	戻値は対象文の(「(」&パターン&「)」)を「\x01$1\x02」で正規表現置換
 	戻値は戻値の「\x02[^\x01]*」を「\x02」に正規表現置換
 	戻値は戻値の「[^\x02]*\x01」を空に正規表現置換
 //
 	マッチ数で条件分岐
 		「0」ならば
 			それは空
 			戻る
 		「1」ならば
 			戻値の「\x02」を空に正規表現置換して戻る
 		違えば
 			戻値を「\x02」で正規表現区切って戻る


変換結果は

 ここは<a href="http://nadesi.com/aaa">http://nadesi.com/aaa</a>と<a href="http://nadesi.com/?aaa">http://nadesi.com/?aaa</a>です。
 今度は<a href="https://nadesi.com/">https://nadesi.com/</a>と書いておきます。
 ここに<a href="mailto:foo@nadesi.com">mailto:foo@nadesi.com</a>と書いておきます。


**指定したWebページを正規表現で絞り込む [#neac85d1]

以下のソースコードをなでしこで実行。適当なURLを指定して、パターンをいろいろ放り込んでみてください。
 
 #指定したWebページを正規表現で絞り込む
 #2010-01-01 ver.002 
 
 ※※※積み木デザイナ:ここから※
 ※ 以下はデザインデータです。
 ※ コメントを削除しないようにしてください。
 ※ ---
 ※母艦とはフォーム##生成
 母艦は「メインフォーム」
 そのクライアントW=640#数値
 そのクライアントH=448#数値
 そのタイトル=「なでしこ」#文字列
 ※ ---
 URLエディタとはエディタ##生成
 そのX=8#数値
 そのY=16#数値
 そのW=416#数値
 そのH=32#数値
 そのテキスト=「http://headlines.yahoo.co.jp/hl」#文字列
 ※ ---
 パターンエディタとはエディタ##生成
 そのX=8#数値
 そのY=64#数値
 そのW=416#数値
 そのH=32#数値
 そのテキスト=「.*」#文字列
 ※ ---
 結果メモとはメモ##生成
 そのX=8#数値
 そのY=104#数値
 そのW=488#数値
 そのH=328#数値
 そのテキスト=「」#文字列
 そのスクロールバー=「縦」#文字列
 ※ ---
 URL更新ボタンとはボタン##生成
 そのX=432#数値
 そのY=64#数値
 そのW=64#数値
 そのH=32#数値
 そのテキスト=「OK」#文字列
 そのクリックした時は〜URL更新ボタン__クリックした時#イベント
 ※ ---
 ラベル1とはラベル##生成
 そのX=8#数値
 そのY=0#数値
 そのW=224#数値
 そのH=16#数値
 そのテキスト=「読み込むWebページ(URL)」#文字列
 ※ ---
 ラベル2とはラベル##生成
 そのX=8#数値
 そのY=48#数値
 そのW=224#数値
 そのH=16#数値
 そのテキスト=「正規表現のパターン」#文字列
 ※※※積み木デザイナ:ここまで※
 
 ページとは、文字列。
 
 ●URL更新ボタン__クリックした時
   URL更新する。
   正規表現ヲ確定する。
 
 ●URL更新()
   ページ=URLエディタからHTTPデータ取得
   文字コード指定=ページを「charset=(.*)」で正規表現マッチ
   それを「(Sift JIS|EUC|euc-jp|JIS|UTF-8)」で正規表現マッチ
   ページ=ページをそれから「sjis」へ文字コード変換
 
 ●正規表現ヲ確定()
   エラー監視
     ページの0からパターンエディタを表正規表現ピックアップ
   エラーならば
     それは「正規表現のエラー」
   結果メモ=それ。
   母艦は「正規表現でWeb絞り込み-{結果メモの要素数}件」


**回数指定{}は、『』でパターンを指定する [#c894a6d2]

なでしこでは、{}を文字列内での変数の展開に使います。そのために、正規表現の回数指定{n,m}と混同されてしまいます。正規表現で回数指定{n,m}などを指定する場合は、パターンを『』で指定します。『』を使うと、テキスト内の変数が展開されません。

 テスト文=「aaa」
 「あああ{テスト文}いいい」を表示 # => あああaaaいいい
 『あああ{テスト文}いいい』を表示 # => あああ{テスト文}いいい


*記号一覧 [#d42a137b]

パターンを記述する際に利用する記号の一覧です。[[BREGEXP.DLL:http://www.hi-ho.ne.jp/babaq/bregexp.html]]を利用しています。

**メタ文字 [#v046b482]

 \     次のメタ文字をクォートする(取り消す)
 ^     行の最初にマッチする。文字クラス中の^は否定(ex. [^a])
 []    文字クラス ハイフンは範囲を表すex.[0-9] 0から9までの数字1文字
 .     (改行以外の) すべての文字にマッチする
 $     行の終わりにマッチする
 |     選択
 ()    グループ化。  カッコの中身は記憶される。$1で置換できる。

 \w   単語の構成文字 (英数字と "_") にマッチ
 \W    単語の構成文字以外にマッチ
 \s    空白文字にマッチ
 \S    空白文字以外にマッチ
 \d    数字にマッチ
 \D    数字以外にマッチ
 \b    単語の境界にマッチ
 \B    単語の境界以外にマッチ
 \A    文字列の最初にのみマッチ
 \Z    文字列の最後にのみマッチ
 \t    タブ
 \n    改行
 \r    復帰
 \f    改ページ
 \a    アラーム (ベル)
 \e    エスケープ
 \033  8 進数で表した文字
 \x1b  16 進数で表した文字
 \c[   コントロール文字

 *      0 回以上にマッチ
 +      1 回以上にマッチ
 ?      1 回または 0 回にマッチ
 {n}    ちょうど n 回にマッチ
 {n,}   n 回以上にマッチ
 {n,m}  n 回以上 m 回以下にマッチ
 
 # {}は、テキスト展開とバッティングするので、テキストを『』で囲むこと


**修飾子 [#y1b73cd9]

 k 文字を日本語(シフトJIS)として扱う。Perlにはない
 m 文字列を複数行として扱う。メタ文字$の処理結果に影響を及ぼす
 g 置換:グローバルな置換
 c 変換:Searchlistを補集合にする
 d 変換:みつかったが置換されなかった文字を削除する
 s 変換:置換された文字が重なったとき圧縮する

*参考リンク [#nb37655a]

参考資料を整理してみました。

**なでしこ記事 [#d68dbcc0]

-[[なでしこで覚える正規表現入門その1〜正規表現とは?:クジラ飛行机「文系サラリーマンのための仕事に役立つプログラミング入門」:http://pc.nikkeibp.co.jp/article/column/20090313/1013132/]]
-[[なでしこで覚える正規表現入門その2〜正規表現とは?:クジラ飛行机「文系サラリーマンのための仕事に役立つプログラミング入門」:http://pc.nikkeibp.co.jp/article/column/20090323/1013541/]]
-[[【コラム】日本語で10行プログラミング (14) デスクトップ検索ツール:http://journal.mycom.co.jp/column/nihongoprog/014/index.html]]
-[[なでしこを使って,日本語でバッチを書こう!:第2回 文字列を操作してバッチを作ろう!|gihyo.jp:http://gihyo.jp/dev/serial/01/nadesico/0002?page=2]]
-[[プログラマーの雑記帳: 正規表現で、文字列は全て半角カタカナか?のチェック(なでしこ編):http://programmer-toy-box.sblo.jp/category/533515-1.html]]

**リファレンス [#ufcb51c1]

-[[分類/文字列処理/正規表現 - なでしこ リファレンス:http://nadesi.com/man/page/%E5%88%86%E9%A1%9E%252F%E6%96%87%E5%AD%97%E5%88%97%E5%87%A6%E7%90%86%252F%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE]]
-[[なでしこライブラリ〜 - ●正規表現行抽出/全抽出:http://www26.atwiki.jp/isoroku_be/pages/44.html]]
-[[日本語プログラム言語なでしこ公式バイブル:http://www.amazon.co.jp/gp/product/4883376036?ie=UTF8&tag=plaseboeffect-22&linkCode=as2&camp=247&creative=7399&creativeASIN=4883376036]](Amazon)
-なでしこ本体にもサンプルプログラムが付属している。「C:\Program Files\nadesiko_lang\sample\文字列処理\正規表現」を参照のこと。

**正規表現 一般 [#hf318d5a]
-[[はじめての正規表現:http://higashizm.sakura.ne.jp/reg/]]
-[[「正規表現の世界」のスライドを公開 - 名もないテクノ手:http://d.hatena.ne.jp/seuzo/20081222/1229872595]]
-[[はじめての正規表現 まとめ - digital 千里眼:http://d.hatena.ne.jp/k2jp/20080920]]
-[[正規表現の機能の覚書き:http://anond.hatelabo.jp/20080923015641]]
-[[正規表現_Perlの小部屋:http://www.komonet.ne.jp/~perl/chap7.htm]]

-[[サルにもわかる正規表現入門:http://www.mnet.ne.jp/~nakama/]]
-[[正規表現サンプル集:http://hodade.adam.ne.jp/seiki/]]
-[[正規表現 - Wikipedia:http://ja.wikipedia.org/wiki/%E6%AD%A3%E8%A6%8F%E8%A1%A8%E7%8F%BE]]

-[[正規表現の最小一致 - 院生エンジニアのにっき:http://life-hack.jp/blog/charly/80]]
-[[PHPで利用できる主な正規表現の覚書 - mtblue.org:http://www.mtblue.org/pc/web/regular_expression.php]]

-[[正規表現テスト-Rubular: a Ruby regular expression editor and tester:http://www.rubular.com/]]
-[[ブラウザで正規表現のお勉強ができる『Scriptular』 | 100SHIKI:http://www.100shiki.com/archives/2012/03/scriptular.html]]


トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS