
一堆JMP字符函數出現在一個上一篇文章:長度、子字符串、包含等。 它們非常適合簡單的事情,而你可以如果你願意的話,可以和他們一起做一些困難的事情。 但正則表達式可能會更好。
正則表達式,縮寫正則表達式,是用於操作文本的強大 JSL 函數。
result = regex( sourceText, searchPattern, replaceTemplate, options );
(JSL 中還有另外兩個函數,其名稱中帶有 Regex;現在只需查看普通的“regex”。 這是您想要的,特別是當您在列公式中使用它時。)
這是對正則表達式的非常不完整的介紹(但對 JMP 正則表達式函數的相當完整的描述)。 你可以在網上找到很多關於正則表達式的教程; JMP的正則表達式搜索模式類似於 Perl 的正則表達式。
這搜索模式是正則表達式並描述要查找的文本。 這替換模板描述如何替換匹配的文本並可以使用匹配文本的位在模板中。 為了清楚起見,以下示例使用文字字符串(用引號引起來)作為第一個參數,但使用一個變量來保存源文本幾乎總是更有意義。
regex( "123 456 789", "[0-9]*")
“123”
這個例子有兩個參數,源文本和搜索模式。 searchPattern 使用方括號創建一組字符。 連字符快捷方式指定一個範圍。 您可以使用 [a-zA-Z] 來創建一組所有大寫和小寫 ASCII 字符。 星號 (*) 表示“重複先前的模式零次或多次”。 \d 是所有數字集合的快捷方式。
regex( "123 456 789", "\d*")
“123”
像 [0123456789] 這樣的字符集可以通過以帽子開頭來否定: [^0123456789] 匹配任何不是數字的字符。 一些快捷方式如 \d 可以表示為字符集:
| \w |
[a-zA-Z0-9_] |
單詞字符 |
| \W |
[^a-zA-Z0-9_] |
不是單詞字符 |
| \d |
[0-9] |
數字 |
| \D |
[^0-9] |
不是數字 |
| \s |
[\t\v\f] |
空白包括製表符、回車符、換行符、垂直製表符和換頁符 |
| \S |
[^\t\v\f] |
不是空格 |
上面的所有快捷鍵都匹配單個字符。 您可以添加星號
\s*
匹配一系列零個或多個空白字符。 或者,您可以添加一個加
\D+
匹配一系列一個或多個非數字字符。 或者,您可以添加一個問號
\w?
匹配零或一單詞字符。
星號、加號和問號是重複運算符,它們是貪婪的。 貪婪意味著他們會獲取盡可能多的文本,然後在需要時退出。 通過添加問號可以讓他們不情願。 一般來說,貪婪是您想要的行為,但並非總是如此。
括號、反向引用和替換模板
正則表達式的很多功能來自於之間的交互搜索模式和替換模板。 交互是通過使用反向引用創建的,表示為 \0、\1、\2、... ReplaceTemplate 默認值為“\0”。 反向引用 \0 是匹配的整個文本。 正則表達式中使用括號將模式的位組合在一起以形成更大的模式。 例如
regex( "cat dog catog cadog cat dog", "cat|dog", "***", GLOBALREPLACE)
“*** *** ***我*** *** ***”
regex( "cat dog catog cadog cat dog", "ca(t|d)og", "***", GLOBALREPLACE)
“貓狗******貓狗”
豎線分隔備選方案,並且優先級非常低;第二個示例使用括號將 t 或 d 組合在一起。 這替換模板只是常量文本,***。 但是每個左括號都開始一個新的反向引用,並且反向引用可以在模板中使用:
regex( "cat dog catog cadog cat dog", "ca(t|d)og", " \1 ", GLOBALREPLACE)
“貓狗td貓狗”
GLOBALREPLACE 使正則表達式查找並替換所有匹配項;該模式與 catog 或 cadog 匹配。 後向引用是 t 或 d,因為這是括號內模式的部分。 模板在 \1 值周圍添加一些空格,然後用模板替換每個匹配的 catog 或 cadog。
可以使用多個括號對,可以是嵌套的,也可以是按順序的。 只需計算左括號即可找到後面的參考號。
數據表公式
這是使用正則表達式的姓氏、名字示例。
Column formula using regex()Column formula using regex()Column formula using regex()Column formula using regex()使用 regex() 的列公式
此示例使用錨點 ^ 和 $(以綠色下劃線)。 ^ 匹配字符串的開頭,$ 匹配字符串的結尾。 \w* 匹配零個或多個單詞字符。這個例子可能太簡單了;它不會處理帶有特殊字符或空格的名稱。 您可以使用反向引用對其進行修改,以逗號分隔:正則表達式(名稱, "([^,]*)", "\1")和正則表達式(名稱, "\s*([^,]*)$", "\1")也許。“([^,]*)”表示零個或多個不是逗號的字符,並且“\s*([^,]*)$”表示跳過零個或多個空格,保留所有非逗號,並位於末尾。 在裡面“([^,]*)” \1 和 \0 的情況相同。 但在"\s*([^,]*)$", \0 可能有 \1 沒有的前導空格,因為 \s* 在 \1 的括號之外。
正則表達式還有很多內容,在網絡其他地方有詳細描述(搜索 regex)。 如果您對如何使用反向引用感到困惑,腳本索引中的 Alice 和 Jerry 示例也非常好。
下一步:模式匹配函數。
2017 年 1 月 29 日更新:修復了新社區的格式。