xyzzy の lisp で正規表現

\の扱い

lispの正規表現は\の扱いが面倒。

ex \をマッチさせる

"\\\\"

ex \\をマッチさせる

"\\\\\\\\"

ex グループ

"\\(\\)"

ex or

"\\|"

ex クォートをマッチさせる

"\""

ex 改行をマッチさせる

"\n"

だから何気ないパスとかも

"\\(\"c:\\)\\(\\\\[^\\]*\\\\\\)\"\n"

こんな伸び放題の芝のようになってしまうという罠。 之でも別に普通に"c:\hoge\\n"とかなので普通にありふれている表現だし。

かといって、これが面倒だからエスケープを多少省略するように表記してそれを変換させると今度は、lisp内部で編集してる時とかこの状態に戻るので逆に混乱しそうで悩ましい。

referenceに乗ってるxyzzyの正規表現

正規表現の表記方法です。以下は

 Toy's xyzzy memo - Data Library -
 http://www.carabiner-systems.com/xyzzy/data.html)

からの引用です。

  • 引用 --- 正規表現 regular expression 1999/12/29 Written by Tetsuya Kamei [xyzzy:03768]
 ^         行頭にマッチ
 $         行末にマッチ
 .         改行文字を除く任意の 1 文字にマッチ
 [...]     文字クラスのどれか 1 文字にマッチ
 [^...]    文字クラスの補集合のどれか 1 文字にマッチ
 *         直前の正規表現の 0 回以上の繰り返しにマッチ (={0,})
           直前の正規表現の 1 回以上の繰り返しにマッチ (={1,})
 ?         直前の正規表現の 0 回か 1 回の繰り返しにマッチ (={0,1})
 \{M,N\}   直前の正規表現の M 回以上 N 回以下の繰り返しにマッチ
 \{M,\}    直前の正規表現の M 回以上の繰り返しにマッチ
 \{,N\}    直前の正規表現の N 回以下の繰り返しにマッチ
 \{N\}     直前の正規表現の N 回の繰り返しにマッチ
 \( \)     グルーピング
 \|        選択
 \1 ~ \9  後方参照
 \<        単語の開始にマッチ
 \>        単語の終了にマッチ
 \b        単語の境界にマッチ
 \B        単語の境界以外にマッチ
 \w        英数字にマッチ
 \W        英数字以外にマッチ
 \sc       シンタックスが c の 1 文字にマッチ
 \Sc       シンタックスが c 以外の 1 文字にマッチ
 \`        バッファの先頭にマッチ
 \'        バッファの最後にマッチ
 \         メタキャラクタのエスケープ
 [たぶん xyzzy 0.2.1.186 から]
 *?        直前の正規表現の 0 回以上の最短の繰り返しにマッチ
  ?        直前の正規表現の 1 回以上の最短の繰り返しにマッチ
 ??        直前の正規表現の 0 回か 1 回の最短の繰り返しにマッチ
           (let ((str "aAaaa"))
             (string-match "Aa?" str)
             (format t "[Aa? ] ... ~S: ~D-~D~%"
                     (match-string 0) (match-beginning 0) (match-end 0))
             (string-match "Aa??" str)
             (format t "[Aa??] ... ~S: ~D-~D~%"
                     (match-string 0) (match-beginning 0) (match-end 0)))
           ->[Aa? ] ... "Aa": 1-3
             [Aa??] ... "A": 1-2
 \{M,N\}?  直前の正規表現の M 回以上 N 回以下の最短の繰り返しにマッチ
 \{M,\}?   直前の正規表現の M 回以上の最短の繰り返しにマッチ
 \{,N\}?   直前の正規表現の N 回以下の最短の繰り返しにマッチ
 \(?:regexp\)
           部分正規表現のグルーピングを行うが,後方参照を行わない
           (すなわち\1,\2とかを使って参照できない,と)
 [さらに xyzzy 0.2.2.202 から]
 \_<       シンボルの開始位置にマッチ 
 \_>       シンボルの終了位置にマッチ 
 \_b       シンボルの境界にマッチ 
 \_B       シンボルの境界以外にマッチ 
 \_s       シンボル文字にマッチ 
 \_S       シンボル文字以外にマッチ

正規表現の確認

isearchで正規表現を確認

Search - xyzzy Note2
http://hie.s64.xrea.com/xyzzy/note2/wiki.cgi?page=Search#p5

isearchで正規表現を動かすようにして、正規表現の検索結果が望んだ部分にマッチしているかで正規表現を確認するとか。

re-builder

 正規表現をチェックするツール。便利。

 正規表現を使ったisearchと比べて何が便利かというと難しいんだけど、気分的には、検索して調べていたときの普通の検索だとすると、re-builderを使うとインクリメンタルで検索しているようなインタラクティブな感じがする。後はグループ分けされたら正規表現とかを色分けして表示もできる。

■Emacsでの説明 Meadow/Emacs memo: 正規表現とは http://www.bookshelf.jp/soft/meadow_48.html

xyzzyではないけど、似ているのでためになる。

正規表現の細かい話

マルチバイト文字の正規表現

 マルチバイト文字は無理なのかと勘違いしてたけど、色々やってたら普通に出来た。[a-z]見たいな感じで[a-z]で何の

全角の正規表現

[0-9]:全角数字
[a-z]:全角アルファベットのa~z
[A-Z]:全角アフファベットのA~Z
[ぁ-ん]:あいうえおの50音 *1
[ァ-ヶ]:カタカナ

 [ァ-ヶ]は調べたら書いてあっただけなので自分は試してないけど問題もない様子。

 ついでにマルチバイト文字と普通の文字を識別したい、コレを直したの、マルチバイトの文字列を間違って使ってなんかエラーが出て動かないとか、そういうのを防ごうかと思って、適当に作ってみた奴。

適当な使用例



トップ   編集 凍結解除 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2010-06-22 (火) 19:09:10 (3289d)