
一堆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)
“*** *** ***og ca*** *** ***”
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)
“貓狗 t d 貓狗”
GLOBALREPLACE 使正則表達式查找並替換所有匹配項;該模式匹配 catog 或 cadog。 後向引用是 t 或 d,因為這是括號內的模式部分。 模板在 \1 值周圍添加一些空格,然後用模板替換每個匹配的 catog 或 cadog。
可以使用多個括號對,既可以嵌套也可以按順序使用。 只需計算打開的括號即可找到後面的參考號。
數據表公式
這是使用正則表達式的姓氏,名字示例。
Column formula using regex()使用 regex() 的列公式
此示例使用錨 ^ 和 $(綠色下劃線)。 ^ 匹配字符串的開頭, $ 匹配字符串的結尾。 \w* 匹配零個或多個單詞字符。這個例子可能太簡單了;它不會處理帶有特殊字符或空格的名稱。 您可以使用反向引用對其進行修改以使用逗號分隔:正則表達式(名稱,“([^,]*)”,“\1”)和正則表達式(名稱, "\s*([^,]*)$", "\1")也許。“([^,]*)”表示零個或多個非逗號字符和"\s*([^,]*)$"表示跳過零個或多個空格,保留所有非逗號,並在最後。 在裡面“([^,]*)”情況 \1 和 \0 是相同的。 但在"\s*([^,]*)$", \0 可能有 \1 沒有的前導空格,因為 \s* 在 \1 的括號之外。
正則表達式還有很多,在網絡上的其他地方都有很好的描述(搜索正則表達式)。 如果您對如何使用反向引用感到困惑,腳本索引中的 Alice 和 Jerry 示例也非常好。
下一個:模式匹配函數。
2017 年 1 月 29 日更新:修復了新社區的格式。