MetaChara


DESC 特定の表現方法を示す文字 WARNING meta chara は[ 正規表現可能な箇所 ]に記述したときに meta chara の意味になる Command によって正規表現の扱いがちがいます 規格は完全に統一されてません


^


DESC 行頭 // ^# 否定 // [^a-c], [^a]


$


DESC 行末( 文字列の末尾 ) // .jpg$ WARNING 改行コードにマッチするわけではない


.


DESC 任意の一文字 // ... 任意の3文字 WARNING . == 表示可能な文字 shell のpath 展開では ? DESC 直前の文字の0回以上の繰り返し ab* -> ab, abb, abbb, a 2. 0 文字以上の任意の文字 ( shell )


?


DESC 直前の文字の0, 1 回の繰り返し test.html? // test.htm || test.html POINT あってもなくてもよい場合に便利 WARNING 基本正規表現では 単なる文字として扱う 2. 任意の1文字 ( shell )


-


DESC 前後に指定された文字の範囲 [ 0-9 ] WARNING 文字コードに依存 POINT 次のケースは通常文字として扱う [a-c], [-abcdt], [abcde-]


[]


DESC []内で記述された一文字 POINT 文字クラスにposix ブラケットを指定可能 ( egrep ) 2. ^, - は[]内ではmeta chara としての扱い 3. 他のmeta chara は[] 内では通常文字としての扱い -> 単なる文字として扱うことができる


|


DESC | の前後の文字列の片方 WARNING | の前後の文字列、正規表現は全体が考慮される
BAD slee|ap -> slee || ap OK sle(e|a)p -> sleep || sleap 基本正規表現では通常文字として扱う( grep -> egrep )



()


DESC meta chara の影響範囲を指定 (foo|bar) 2. 後方参照 POINT 基本正規表現では () を通常文字として扱う場合は \(, \) とする


\<\>


DESC 単語の(先頭|末尾)の空文字にマッチ
\<no // nothing, nobody, \<no\> // no
POINT <, > は通常文字としての扱い


min max


SYNTAX {min,max} DESC 直前の文字の繰り返し回数
# ee, eee, eeee, eeeee # e を 2 〜 5 回の繰り返し e{2, 5} # [0:3] e{,3} # RET : aaa echo "aaa" | grep "a\{3,4\}"



\b


DESC 単語の境界にマッチ( boundary ) 単語とは [a-zA-Z0-9] 以外の文字 == [:./\ \n] // 制御文字も含む 単語の(先頭|末尾)とは 上記の文字列が切り替わる箇所 空文字とは 文字の間にある論理的な文字 WARNING 空文字 != ( [a-zA-Z0-9] | [:./\ \n] ) 単語の境界にマッチ == 単語 ^単語の間の空文字にマッチ ie : 空集合 word -> 行頭 n w n o n r n d 行末 WARNING 制御文字を意味する\b もある [\b] は単語境界を意味 grep は\b:backslash は非サポート


\d


DESC 数字 1文字 Digit POINT == [0-9], [[:digit:]] WARNING grep では使用できない ?


\D


DESC 数字以外 1文字 POINT == [^0-9], [^[:digit:]]


\s


DESC 空白文字の 1文字 POINT 空白文字 == [ \t\n\r\f] == [[:space:]] POINT \S == ^空白文字


\w


DESC alphabet || 数字 1文字 ( word ) POINT [a-zA-Z0-9] == [[:alnum:]] _ 含む POINT grep で使用可能 制御文字の表現 なぜ制御文字をサポートする? tag, 改行にまたがるパターンを指定できる database file 制御文字の表現方法 \x のようにescape する \a == 0x07 \b == 0x08 \e == 0x1B [ESC] \f == 0x0C [FF] \n == 0x0A [LF]( unix ), 0x0D0x0A[CRLF]( win ) POINT 論理的な改行コードを意味、platform に非依存[ 改行 == \n ] \r == 0x0D [CR] \t == 0x09 [HT] \s : 空白文字 ( 正規表現のmeta chara ) POINT meta chara にbindされない制御文字は文字コードで直接指定 foo\tbar -> foo\011bar // 8進数で指定する場合3 桁で WARNING grep, emacs では失敗 foo\tbar -> foo\x09bar // 16進数で指定する場合 meta chara のエスケープ 目的 meta chara として使用される文字を通常の文字として扱うため $100 // 行末 + 100 \$100 // $100 \100 // 後方参照 \\100 // \100 \b // 単語境界 \\b // \b posix ブラケット表示 目的 code 体系に依存しない文字クラスの表現をするため [0-9] == code 0 から code 9 の範囲の文字コード, != [0<=nr<=9] POINT よく使用される文字code( ASCII がbase == ASCII code 体系 ) ShiftJIS EUC Unicoord DESC [[:xxx:]], xxx 論理的な文字セットを表す 文字自体ではない local に依存 [[:upper:]] 指定した文字コードの大文字 != alphabet 大文字 ( ASCII code 体系 ) alnum : alphabet + nr cntrl : 制御文字[\b \n \t \e] lower : alphabet 小文字 space : blank + [\n] alpha : digit : nr print : [[:graph:]] + SPC + (TAB?) upper : alphabet 大文字 blank : SPC + TAB, [^\n] graph : 表示可能文字, [[:alnum:]] + [|&*] punkt : 英記号, 表示可能文字 && [[:alnum:]] || SPC でない xdigit : 16進表記, [0-9a-fA-F], perl only word : word == \w 基本正規表現 拡張正規表現 WARNING 拡張 != 基本 + α , ( 混在している ) list . ○ ○ * ○ ○ + - ○ // == {1,} ? - ○ // == {0,1} {min,max} \{\} ○ // meta chara として扱うため \ する( 逆? ) ^ ○ ○ $ ○ ○ [^] ○ ○ [-] ○ ○ () \(\) ○ // meta chara として扱うため \ する( 逆? ) | - ○ 後方参照 ○ - 各tool の 正規表現のサポート WARNING toolが基本正規表現, 拡張正規表現の規格に一致する訳ではない 基本正規表現 sed, ed 拡張正規表現 egrep list egrep sed emacs . ○ ○ ○ * ○ ○  ○ + ○ \? ○ ? ○ \? ○ {min,max}  ○ ○ ○ // meta chara として扱うため \ する( 逆? ) ^ ○ ○ ○ $ ○ ○ ○ [^] ○ ○ ○ [-] ○ ○ ○ () ○ \(\) \(\)// meta chara として扱うため \ する( 逆? ) | ○ \| \| 後方参照 ○ ○ ○ \<\> ○ ○  ○ {}     ○ \{\} - // emacs 対応?, {}が文字のケースが多い-> \ \b\B ○ ○ ○ \d\D - - - \s\S - - - \w\W ○ ○ ○ posix bra ○ column DFA : 決定性有限オートマトン -> 平行処理 NFA : 非決定性有限オートマトン -> 逐次処理( back track )


Shell.の.MetaChara


DESC file path の正規表現のため command line 変換 は [*] してしまえば けっこういけます
* : 0 コ以上の任意の文字 ? : 任意の1文字 [] : []内の任意の文字 [^xyz], [!xyz], -> [^xyz] で統一
POINT path名置換に失敗しても、そのままの引数がcmdにわたる
# echo を利用して結果が見れます echo *.htm -> foo.htm bar.htm # 失敗するとそのままかえる echo *.htm_xxx -> *.htm_xxx # file path の変換に使う cp -upv /work/dust/foo/bar/kosinpri/*.jsp $dst/jsp # FilePath にマッチするなら Current Directory でなくてもOK ls ./sub/*.txt
POINT Shell の CmdLine も WildCard 展開をする // shopt == shell option // 以下のものを .sh にいれておくと. shell の制御が可能 shopt -s nullglob で cmd line の処理を終了 shopt -s igncr $SHELLOPTS igncr を いれることで CRLF の CR を無視. WARNING cmd の正規表現と区別する egrep 'foo*' file // 'foo*' の * はgrepの正規表現


{}.brace.展開


DESC []内, で区切った文字列を順に展開
/home/{bin, sbin} -> /home/bin /home/sbin
WARNING regex の {}とは異なる 行頭と行末, 空文字 行とは [\n]の次の文字から次の[\n]が現れるまでのdata POINT 多くの toolは行単位で textを処理 論理的な行頭 特定の文字に依存しない論理的な行頭 WARNING 行頭の文字コードがあるわけではない POINT foo bar -> ^foo bar と考える


後方参照


DESC 後で参照するptn を()をつけて、\nで参照
aaa.htm,aaa.jpg のような組み合わせのptn表現可能



最長一致と最短一致


DESC ptn マッチにおいて、できるだけ長く一致する動作 [*?+{min,max}]時に機能 tool 間でほぼ共通の動作 tom aaa(bbb) cccc) sed 's/aaa.*)/out' file -> tom out


最短一致の指定


aaa.*) -> aaa.*?) : perl 互換のtoolでサポート POINT sed 'a/aaa[^\)]/out' file : [)]以外の文字と明示する