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 : [)]以外の文字と明示する