2007年9月27日 星期四

Regular Expression(正規表示式) notes


/*
*為什麼會有這篇 因為有一天可愛的鐘逸學長在問帥氣的柏州學長(明顯在巴結人)一個有關正規表示式的問題時,被好像在專心念書,其實一直在觀察四週的我(偷?)聽到了,try to find a method but in vain的感覺很不好,所以複習一下正規表示式囉!

*/

[a-Z]: 表示a-z,A-Z其中"一個"字母
[^a-Z]:表示非a-z,A-Z其中之一
*:量詞,出現零次或一次以上
.: 表示任何一單一字元
^:列首
$:列尾
\< :單字開始處 \> : 單字結束處



[:album:] 任何字母與數字
[:alpha:] 任何字母
[:cntrl:] 任何控制字元
[:digit:] 任何數字
[:lower:]任何一小寫字母
[:upper:]任何一大寫字母
[:print:]任何一可印字元
[:space:]任何空格字元



=======
好用的:
:%s /pattern/&/g 可用來計算有幾個符合pattern的字串(&表示符合pattern的字串,故代換後不改變文章)
\([a-z]\{2}\)\{2,\}\3,5\}
:%s/\([^0-9]\{1,}\)
去除/*………*/c語言註解
:%s:\/\*\(.\{-}\)\s*\*\/:\1:g
去除//
:%s://::g
(喜歡想太多的人可以用:%s:\/\/\(.\{-\}\)\s\+:\1:g)
=======
Reference:
msdn:正規表示式介紹(中文)
Regexp Syntax Summary
Regular Expression Library
RegExLib

/**
後記:雖然問題已被解出來,但是我還是得承認我沒弄懂整個指令的來龍去脈....
其實問題很簡單:
--
A女:"不要嘛~"
"來啦~",B男低語著…(內容純屬虛構)
-------
Scenario:小說中的對話原本是用""雙引號標記的,但現在作者想改用[ ],像vi 這種支援正規表示式的editor可如何快速取代呢?

**/


9 則留言:

Kanru Chen 提到...

囧... 打錯

答案是

:%s/"\(.\{-}\)"/[\1]/g

原來是對話阿,還以為是人物名稱

Hsiao-Ting 提到...

謝侃侃~

=======
Google啊~你真可怕… says:
你第一個意見怎麼不見了
Rocky Kan-Ru @ 宿舍 says:
下面有解釋
Google啊~你真可怕… says:
\1 backslash加數字到底是什麼意思?
Google啊~你真可怕… says:
那時候就是不懂這個
Rocky Kan-Ru @ 宿舍 says:
\n 就是第 n 個 match group
Rocky Kan-Ru @ 宿舍 says:
一個 match group 是包含在 () 裡面的東西
Rocky Kan-Ru @ 宿舍 says:
在 vim 裡面 () 要寫成 \(\)
Google啊~你真可怕… says:
那我看學長用了\4
Google啊~你真可怕… says:
↑↑ 那我懂~~~
Rocky Kan-Ru @ 宿舍 says:

Rocky Kan-Ru @ 宿舍 says:
用 \4 ...
Rocky Kan-Ru @ 宿舍 says:
可能是用奇怪的方法吧

Kanru Chen 提到...

補充...

vim 的 regexp

http://larc.ee.nthu.edu.tw/~cthuang/vim/files/vim-regex/vim-regex.htm

Hsiao-Ting 提到...

ohoh~身為鄉民的我要打屁股了…lazybone
在Linux板有類似解答,我還跑去問侃侃。

---
(轉錄如下)
> 最近在用Vim寫程式,想請教幾個取代的問題
> 例如:
> sprintf("%s", g_caAlertMsg);
> 我想用vim去做一個一次取代
> ,其條件為在一行裡面找到第一個"時,將"取代為"[%s.%d]
> 找到第二個"時,取代成",__FILE__, __LINE__
> 結果應該為
> sprintf("[%s.%d]%s",__FILE__,__LINE__, g_caAlertMsg);
> 由於程式太多了,所以我想知道有沒有快速取代的方式?
> 希望不吝指教...謝謝

不懂, 如果要整行都 match 才換, 那就整行換就好了呀.
如果不管啥, 有 " " 都要換, 那你可以這樣用
:%s/"\([^"]*\)"/"[%s.%d]\1",__FILE__, __LINE__/
還是是 sprintf 的才要換??
%s/\(sprintf(\)"\([^"]*\)"/\1"[%s.%d]\2",__FILE__, __LINE__/

可以看一下 regular expression 的資料.

Hsiao-Ting 提到...

今天到lab用vim一試,it really works!
真的變成
========

A女:[不要嘛~]
[來啦~],B男低語著…(內容純屬虛構)

Arrakeen 提到...

在 vim 裡面可以試試看 \v
這樣 pattern 會比較乾淨 :)

:%s/\v"(.{-})"/[\1]/g

Arrakeen 提到...

對了可以看 :h pattern
\v 是 very magic
\V 是 no magic. 所以要用 escape 跳脫特殊比對字符

Hsiao-Ting 提到...

謝謝你。:D
這樣好像真的比較簡潔,也比較專業…XD

Hsiao-Ting 提到...

對了!我之前好像有偷看過你的網誌,剛看到你留言,小小害羞了一下:)