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 則留言:

  1. 囧... 打錯

    答案是

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

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

    回覆刪除
  2. 謝侃侃~

    =======
    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:
    可能是用奇怪的方法吧

    回覆刪除
  3. 補充...

    vim 的 regexp

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

    回覆刪除
  4. 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 的資料.

    回覆刪除
  5. 今天到lab用vim一試,it really works!
    真的變成
    ========

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

    回覆刪除
  6. 在 vim 裡面可以試試看 \v
    這樣 pattern 會比較乾淨 :)

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

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

    回覆刪除
  8. 謝謝你。:D
    這樣好像真的比較簡潔,也比較專業…XD

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

    回覆刪除