Gauche:正規表現を使う
yamasushi(2013/04/20 21:57:11 UTC)正規表現についての情報をまとめてみます。
- 関連ファイル
- 概要
- Gaucheの設計思想や誕生の背景 - karetta.jp
http://karetta.jp/book-node/gauche-hacks/008237
正規表現リテラルは他のScheme言語処理系にないユニークな特徴です。正規表現を取り入れたScheme言語処理系もなかったわけではありませんが、Perlに似た正規表現リテラルを採用した処理系は珍しいと言えます。
Perlに似た正規表現リテラルがScheme言語処理系であまり採用されなかった理由は、S式を主体とするLisp系の言語の構文には、正規表現リテラルを使ったPerl風の構文が馴染まなかったからです。Gaucheはあえて正規表現リテラルを取り入れ、実用的なスクリプトが書けるようにScheme処理系を拡張しました。
- Gaucheの設計思想や誕生の背景 - karetta.jp
- チュートリアル
- タブをスペースで展開する - Gaucheクックブック
http://d.hatena.ne.jp/rui314/20061227/1167179218
- Schemeの正規表現では^$は行頭行末には対応しない - Lambdaカクテル
http://d.hatena.ne.jp/Windymelt/20120316/1331904525
- GaucheRefj:Schemeスクリプトを書く GaucheRefe:Writing Scheme scripts
次のスクリプトは簡単なgrepコマンドです。
#!/usr/bin/env gosh (define (usage program-name) (format (current-error-port) "Usage: ~a regexp file ...\n" program-name) (exit 2)) (define (grep rx port) (with-input-from-port port (lambda () (port-for-each (lambda (line) (when (rxmatch rx line) (format #t "~a:~a: ~a\n" (port-name port) (- (port-current-line port) 1) line))) read-line)))) (define (main args) (if (null? (cdr args)) (usage (car args)) (let ((rx (string->regexp (cadr args)))) (if (null? (cddr args)) (grep rx (current-input-port)) (for-each (lambda (f) (call-with-input-file f (lambda (p) (grep rx p)))) (cddr args))))) 0)
- 例題のgrepに学ぶgauche - どらや記
http://d.hatena.ne.jp/dorayakitaro/20090614/p1
- 正規表現 - karetta.jp
http://karetta.jp/book-node/gauche-hacks/004648
- 繰り返し - karetta.jp
http://karetta.jp/book-node/gauche-hacks/007208
- グループ化 - karetta.jp
http://karetta.jp/book-node/gauche-hacks/007422
- 特殊文字 - karetta.jp
http://karetta.jp/book-node/gauche-hacks/007510
- 繰り返し - karetta.jp
- 正規表現に詰まりまくってた。 - このブログの90%はガラクタ
http://kiris.hatenablog.com/entry/20080501/1209641607
- Scheme:初心者の質問箱:log00
グローバルなマッチ
Gaucheの正規表現(#//)を便利に使わせて頂いております。 Perlで/gを指定したときのように、一行中にある複数のマッチした文字列を取り出す方法はございますでしょうか? es (2006/04/11 04:35:07 PDT)
Rui (2006/04/12 05:59:58 PDT): 自分でループをまわすしかないかも。Perlライクな動きだと次のようなコードで実現できるかもしれませぬ。
(use srfi-42) (define (rxmatch-all re str) (let loop ((r '()) (str str)) (let1 m (rxmatch re str) (if m (loop (let1 nmatch (rxmatch-num-matches m) (if (= nmatch 1) (cons (m 0) r) (append! (reverse! (list-ec (: i 1 nmatch) (m i))) r))) (m 'after)) (reverse! r))))) (rxmatch-all #/./ "abc") ; => ("a" "b" "c") (rxmatch-all #/.(.)/ "abcde") ; => ("b" "d")
- GaucheRefj:grxmatch GaucheRefe:grxmatch
GaucheRefj:lrxmatch GaucheRefe:lrxmatch
Function: grxmatch regexp gen
The gen argument must be, after coerced, a generator that yields characters.
A generator returned from this procedure tries to match regexp from the character sequence generated by gen, and once it matches, remember the position after the match and returns #<rxmatch> object. If no more match is found, the generator is exhausted.
($ generator->list $ gmap rxmatch-substring $ grxmatch #/\w+/ "The quick brown fox jumps over the lazy dog.") ⇒ ("The" "quick" "brown" "fox" "jumps" "over" "the" "lazy" "dog")
- 応用
- Gauche:Regexpの中間表現
Gauche では正規表現を一旦 S 式による中間表現に変換してから 正規表現コンパイラに渡す。こうすることにより、正規表現の最適化部分を リスト処理で書いたり、SRE のような別の構文をサポートすることが 容易になっている。
- Gauche:Regexpの中間表現
- SRE
http://www.scsh.net/docu/post/sre.html
http://www.scsh.net/docu/html/man-Z-H-7.html
S-expression Regular Expression。正規表現のS式表記。
- Gauche:SRE
leque: Gauche:Regexpの中間表現 の仕組みをつかって Gauche で SRE を使ってみようとする試み。
http://www.katch.ne.jp/~leque/software/repos/gauche-sre/
- sxpathのクエリに正規表現を書けるようにする - 再帰の反復
http://d.hatena.ne.jp/lemniscus/20100412/1271085824
- その他
- Gaucheで正規表現 - `(Hello ,world) - cadr group
http://cadr.g.hatena.ne.jp/mokehehe/20080308/1204942752
- Gaucheで正規表現 - `(Hello ,world) - cadr group
- 小物
- match-lambdaの正規表現版。(cut rxmatch-case <> .... )で書いていたのですが、cutは関数が対象であるということを聞いたので。
(define-macro (rxmatch-lambda . clause) (let1 sym (gensym) `(^(,sym) (rxmatch-case ,sym ,@clause) ) ) )
- match-lambdaの正規表現版。(cut rxmatch-case <> .... )で書いていたのですが、cutは関数が対象であるということを聞いたので。