規則運算式(Regular Expression)的環顧樣基(Lookaround)的學習心得
Posted on 2007-12-28 13:13 黃偉榮 阅读(1640) 评论(1) 编辑 收藏 举报測試工具
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),等了一年多了,台灣還是沒有翻譯。