2014年3月11日火曜日

UNIXの正規表現

ド素人がWikipediaを読んで、学び始める前の曖昧なきっかけをつかむかもしれない程度。

正規表現とは、ギョーカイ用語で文字列の省略表記とこの解釈、ということのようで。

Basic Regular Expression
grepやsedなどの、UNIXのユーティリティのデフォルトらしい。

リテラルとメタ

リテラルは見たそのまま 文字は文字 文字以外の機能を示さない扱い
メタは何らかの機能を意味する 言葉としては高次の(ナニナニ) 他の文字のための何らかの別の意味を持つ



. 任意の一文字
 .at hat、cat、bat


[ ] 括弧内に含まれる一文字

 [abc] a、b、c
 [hc]at hat、cat


- 括弧内の最初か最後にあるときはリテラル
  そうでないときはメタ

 リテラル扱い
 [abc-]  a、b 、c 、-
 [-abc] 同じ

 メタ扱い
 [a-z] 全ての小文字
 [abcq-z] a、b、c、q、r、s、t、u、v、w、x、y、z
 [a-cq-z] 同様


尚 [ の記号そのもの、]の記号そのものについては、囲んでいる括弧内で  [ 記号、 ] 記号を先に書く。

 [][ab] と書けば  ]の記号、[の記号、a、b の4つの文字のうち1文字

 敢えて不正確に書くなら [ ],[,a,b, ] ということ


[^ ] 括弧内に含まれない一文字

 [^abc] a、b、c 以外の任意の一文字
    [^b]at bat 以外の .at でマッチする全ての文字列
 [^a-z]  小文字以外の任意の一文字
 混用可能


^ 行の最初にマッチ
$ 行の最後にマッチ

    ^[hc]at 行の冒頭である場合のみ hat と cat にマッチ
    [hc]at$ 行の末尾である場合のみ hat と cat にマッチ


\( \) 後に呼び出し重複利用するための記号

\n  1から9までの数をメタとして利用
   \( \) で囲まれた部分の0回以上の繰り返し

独自解釈: 0回ではそもそも書く意味がないので実質1回以上、ただし無視してもいい、ということか!?

*   直前の文字を0回以上の繰り返し
 []と組み合わせると複雑な表現に
 [xyz]* x、y、zx、zyx ・・・など

さらにこれらを組み合わせると

 \(a.\)c\1* abcab、abcabab ・・・様々な可能性がある一方で abcac ではない

 これを1文字ずつ改行して並べると
 1文字目はa
 2文字目は.なので任意の一文字
 3文字目はc

 そして4文字目に相当する正規表現は\1なので
 a.を1回繰り返す
 必然的に4文字目のみならず5文字目を記述することになる

 6文字目は*
 これは直前の文字の繰り返しだが
 *の直前の文字に相当する正規表現は\1なので
 a. の0回以上の繰り返しになる


尚、\(* と \)* という表現がもしあったとしても、*は無効。



POSIX


0 件のコメント:

コメントを投稿