字串樣式的表示法
Regular Expression 可以做什麼?
嫩
或是更複雜的需求
RE 可以輕鬆辦到
哪裡可以用 Regular Expression
Visual Studio 的 Regex 支援
vim 中的 Regexp 支援
Regexp 比對符號規則
任意字元
. 一定要比對到一個字元
比對 Metasymbol
Regexp | Matches | Doesn't match |
a.b | axb | abc |
a\.b | a.b | axb |
字符集
Regexp | Matches | Doesn't match |
a[a-z]b | acb, abb | aCb, a2b, ab |
a[^a-z]b | a@b, a2b | acb, ab |
[Jj][Oo][Ee] | Joe,jOE | je,jo,jeo |
[] 也一定要比對到一個字元
樣式重複的出現
* 可以代表 零次!!
樣式重複的出現
在 shell 下使用 grep
$ grep [a-z][0-9]+ file 錯!
$ grep '[a-z][0-9]+' file 對!
grep regexp files …
cat files … | grep regexp
若不用 ' ' 框起來,會被 shell 用於比對檔案名稱,而先行處理掉!
$ ls # 目錄中有這些檔案
a0+ aa b32 b9+
$ echo [a-z][0-9]+ # 樣式被處理掉了
a0+ b9+ # 原本預期印出 [a-z][0-9]+
Shell 提供的檔名比對並非 regexp
$ ls
hello.txt a01.jpg a02.jpg a03.jpg �a04.jpg aa b32.jpg aa.txt
$ ls a[0-9][0-9]
ls: cannot access a[0-9][0-9]: No such file or directory
$ ls a[0-9][0-9]*
a01.jpg a02.jpg a03.jpg a04.jpg
* 不代表次數,是萬用字符�相對於 regexp 是 .*
Grouping
Regexp | Matches | Doesn't match |
a(bc)*d | ad, abcd, abcbcd | acd, acbd |
([0-9]0)+ | 20, 2010, 102030 | 11, 2120 |
Grouping and Memory
貪心的量詞
定位點
或 |
眾多延伸的 regexp 語法
每個 Tool 的 Regex 不盡相同
$ echo -e 'hh os hh\nhhoshh\nhhos hh\nhh oshh'
hh os hh
hhoshh
hhos hh
hh oshh
$ echo -e 'hh os hh\nhhoshh\nhhos hh\nhh oshh' | grep '\bos'
hh os hh
hh oshh
$ echo -e 'hh os hh\nhhoshh\nhhos hh\nhh oshh' | sed -ne '/\<os/p'
hh os hh
hh oshh
同 vi
一份簡略的 Regexp 比較表 http://www.greenend.org.uk/rjk/2002/06/regexp.html
要不要 Escape metasymbol
在 grep 中,若要 group 需用 \( \)
在 egrep 中,若要 group 用 ()
Tool 這麼多,要如何查詢語法
說明就在我們手邊
一份簡略的 Regexp 比較表 http://www.greenend.org.uk/rjk/2002/06/regexp.html
Regex 並非萬能
<div>
<div>
<div>
…
</div>
</div>
</div>
<div>
<div>
</div>
</div>
…
目標
<div>.*</div>
<div>.*?</div>
巢狀格式,對 Regex 很難,�但用程式寫卻能輕鬆解決
Cowsay
Shell Script for
xargs
find
_____
< FIN >
-----
\ ^__^
\ (oo)\_______
(__)\ )\/\
||----w |
|| ||
參考