天天看點

正規表達式的屬性和方法建立正則對象屬性方法

在1956 年,一位名叫 Stephen Kleene 的數學科學家,發表了一篇《神經網事件的表示法》的論文,論文中采用正則集合的數學符号來模拟人類神經系統的工作原理。後來人們将這一成果轉化到計算機算法中,将其變成了一門文本搜尋和處理的語言。

正規表達式(Regular Express ),可以按字面意思了解,正确的符合規則的表式。

在 CAD 的二次開發中,簡單的文字比對可以用 Lisp 自帶的 wcmatch 函數,但是這個函數傳回值隻有 T 或 NIL。 如果需要傳回比對後的相關字元時,或者稍微複雜一點的文字比對, wcmatch 就無能為力了。

深入地學習正規表達式的文法還是有些難度的,我用的是偷懶的辦法,隻寫最簡單的正則文法,對于複雜的正則文法網上都能搜到。但無論怎樣,前提是要弄清楚正則的屬性和方法。

建立正則對象

在AutoCAD中建立正規表達式對象:

對象建立成功時,可以用以下代碼檢查 RegObj 對象支援的屬性和方法:

傳回如下:

;特性值:
;   Global = 0
;   IgnoreCase = 0
;   Multiline = 0
;   Pattern = ""
;支援的方法:
;   Execute (1)
;   Replace (2)
;   Test (1)
        

可以發現,正則對象支援的 4 個屬性和 3 個方法,其組織結構圖如下:

正規表達式的屬性和方法建立正則對象屬性方法

屬性

正規表達式支援的屬性有 4 個,分别為 Global、IgnoreCase、Multiline、Pattern

Global 全局搜尋

預設值為 0,正則引擎預設搜尋到第一個關鍵字後停止;如果需要全局搜尋,可将其屬性設定為 1,代碼如下:

IgnoreCase 大小寫敏感

預設值為 0,敏感模式,即搜尋時區分大小寫;如需忽略大小寫代碼如下:

Multiline 多段搜尋

預設 0,不分段。此參數僅對元字元^和

$

(開始和結束)有影響

當設定為 1 時,^|$ 代表每行的開始或結束

Pattern 搜尋時的描述字元串

正規表達式的核心參數,正規表達式變化多樣的文法靠此參數實作

例如:不含換行符的任意字元

方法

正規表達式支援的方法有 3個,分别為 Execute、Replace、Test

Test 方法

測試目标文本中,是否包含正規表達式所描述的字元串(即 Pattern 參數)。

傳回值: 未找到時傳回 0 ; 找到則傳回 -1

Replace 方法

在目标文本中用正規表達式查找到的字元串替換,并傳回替換結果。

例如用 “=” 替換字元串中的 “c”

(vlax-put-property RegObj 'Pattern "c") 
(vlax-invoke RegObj 'Replace "abcefg" "=")
           

傳回 “ab=efg”

變量分組

來看這一段文字:”白菜20蘿蔔56洋芋31茄子47”,我們需要為數字後加一個機關 “kg,”

(vlax-put-property RegObj 'Pattern "\\w+")
(vlax-invoke RegObj 'Replace "白菜20蘿蔔56洋芋31茄子47" "kg,")
           

傳回 “白菜kg,蘿蔔kg,洋芋kg,茄子kg,”

結果把數字也替換掉了,怎麼辦?我們需要比對的字元串出現在它原來的地方,實作插入字元串的效果。這時候就需要用到變量的分組,用 “$1” 代表第一組正則 Pattern , Pattern 文法單元需要用 () 分組,每對括号代表1組變量。

(vlax-put-property RegObj 'Pattern "(\\w+)")
(vlax-invoke RegObj 'Replace "白菜20蘿蔔56洋芋31茄子47" "$1kg,")
           

傳回 “白菜20kg,蘿蔔56kg,洋芋31kg,茄子47kg,”

變量分組最多可以支援到 99 組。

Execute 方法

在目标文本中執行正規表達式搜尋。 傳回一個 Matches 對象集合,該集合具有

count 屬性(比對次數)、 item 屬性(項索引),以及一個 matche 對象

(vlax-put-property RegObj 'Pattern "\\w+")
(setq mat (vlax-invoke RegObj 'Execute "我們we你們you這兒here那兒there"))
           

檢查 count 屬性

傳回 4,即比對了 4次

檢查 item 的第一項

傳回第一個比對的對象 we

如需所有對象的值,可以用 vlax-for 函數周遊 matche 對象集合,該對象具有四個屬性,但我們隻需要 value 屬性。

(setq L nil)
(vlax-for x mat (setq L (cons (vla-get-value x) L)))
           

傳回:(“there” “here” “you” “we”)

舉一個簡單的栗子

(defun test (s p / L)
(setq r (vlax-create-object "vbscript.regexp"))
(vlax-put-property r 'Global )
(vlax-put-property r 'Pattern p)
(vlax-for x (vlax-invoke r 'Execute s)(setq L (cons (vla-get-value x) L)))
(vlax-release-object r)
(reverse L)
)
           

以下代碼實作中英文按字元分離的效果:

傳回 (“我” “愛” “C” “A” “D”)

如果需要中英文按詞組分離,隻需要設定不同的 Pattern 屬性即可。

傳回 (“我愛” “CAD” “你喜歡” “CAD” “嗎”)

繼續閱讀