黃偉榮的學習筆記

軟體的世界變化萬千,小小的我只能在這洪流奮發向上以求立足。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

測試工具
Expresso http://www.ultrapico.com/Expresso.htm

The Regulator 2.0 http://tools.osherove.com/CoolTools/Regulator/tabid/185/Default.aspx
RegexDesigner http://www.sellsbrothers.com/tools/ 單純測Regex我比較喜歡用這個,因為介面比較簡單,開發的話上面二個功能較多。

環顧樣基就像是規則運算式中的if,為pattern先決條件的,在Replace中非常的好用,如一段字串Regex Expression要將前面是R、g的e換成E
一般的換法是      
    Regex.replace("Regex Expression","([Rg])e","$1E")  
環顧樣基的換法是  
    Regex.replace("Regex Expression","(?<=[Rg])e","E") 為e加上左合樣的條件。
結果
    REgEx Expression

你應該可以從這個簡單的小範例中,了解環顧樣基的用法。

環顧樣基有四種語法

符號 名稱 說明
(?=...) 右合樣(postive lookahead) 受測字串的右邊,必需通過合樣才算符合條件
(?!...) 右不合樣(negative lookahead) 受測字串的右邊,必需不通過合樣才算符合條件
(?<=...) 左合樣(postive lookbehind) 受測字串的左邊,必需通過合樣才算符合條件
(?<!...) 左不合樣(negative lookbehind) 受測字串的左邊,必需不通過合樣才算符合條件

這是我遇到的問題,從中領悟出環顧樣基的用法
問題一
用過.Net的XPath人都知道,處理有XSD的XPath很麻煩,所以我寫了一個類,去處理XPath的命名空間,例如:
/books/book
我的類會自動加上預設的命名空間(this)變成
/this:books/this:book

但如果已經有命名空間或屬性,則不補上預設的命名空間。
/bk:books/book/@Name > /bk:books/this:book/@Name
語法
Regex.Replace(raw, @"/(?!(\w*:\w*)|@)" , "/this:")
說明
於 / 後使用右不合樣,如果 / 後面的字串不是 xx:xx 或 @ 的就替換成 /this:

上面的字串替換,原本要寫上近十行才能決解的,用上了環顧樣基只要一行,是不是很好用。

問題二
我有一個字串,內容如 "業務部,行銷部,行銷業務部..."  如果要將其中的業務部改成業務課
不能用Replace(raw,"業務部","業務課")因為會動到後面的行銷業務部,我以前的作法是用Split成陣列,在一個一個比較替換,然後再組成字串,太麻煩了,後來用環顧樣基,一行就搞定了。

語法
Regex.Replace(raw, @"(?<=(,|^)\s*)業務部(?=\s*(,|$))", "業務課")
說明
業務部的右邊是(行開頭或逗點或空白)和左邊是(行結尾或逗點或空白)就替換成業務課


在寫規則運算式時都有小小的抱怨,精通正则表达式(Mastering Regular Expressions),等了一年多了,台灣還是沒有翻譯。