A pattern cut with a laserA pattern cut with a laserA pattern cut with a laserA pattern cut with a laser用激光切割的圖案
JMP的模式匹配功能可以做到幾乎正則表達式可以做的一切稍微多一點。 在內部,正則表達式是根據模式匹配函數構建的,並具有易於使用的界面。 你可能永遠不需要稍微多一點,所以如果您有正則表達式的經驗,那麼它可能是一個不錯的選擇。 或者,您可能會發現模式匹配語言更有吸引力。 這些正則表達式可能非常不透明。
最簡單的模式匹配可能如下所示:
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs" ); // ok will be 1 because the pattern "eggs" is found
1
將雞蛋改為培根:
source = "the old fox had eggs for breakfast";
ok = patMatch( source, "eggs", "bacon" ); // 3rd argument is the replacement text
print(source);
"the old fox had bacon for breakfast"
並找出狐狸吃什麼:
morningMeal = .;
source = "the old fox had yogurt for breakfast";
foods = "eggs" | "bacon" | "yogurt" | "honey";
ok = patMatch( source, foods >? morningMeal ); // >? is an assign-to-the-right operator for patterns
print(morningMeal );
"yogurt"
如果您以前沒有見過這些模式,您可能會對看起來奇怪的分配感到困惑食品。 這些單豎線的意思是“或”。 它們不是用於連接字符串的雙豎線。食品是一個模式值,將與這四個單詞中的任何一個匹配。 還有一個用於連接模式的 + 運算符(與連接字符串不同)。 讓我們加強一下這個例子:
source = "the old fox had yogurt for breakfast, honey for dinner, and bacon for lunch, but eggs at bedtime.";
foods = "eggs" | "bacon" | "yogurt" | "honey";
morningMeal=.;
middayMeal=.;
eveningMeal=.;
ok1 = patMatch( source, ( foods >? morningMeal + " for breakfast" ) );
ok2 = patMatch( source, ( foods >? middayMeal + " for lunch" ) );
ok3 = patMatch( source, ( foods >? eveningMeal + " for dinner" ) );
show(morningMeal, middayMeal, eveningMeal);
morningMeal = "yogurt";
middayMeal = "bacon";
eveningMeal = "honey";
三個單獨的匹配項來查找食物,然後查找一天中的某個時間(使用 + 連接模式)。 您還可以通過簡單的步驟構建更複雜的模式:
首先,一個匹配數字範圍的小模式
digits = patSpan("0123456789");
然後是使用數字模式來匹配數字的模式,例如-314.15E-2 。 "" 選項不允許匹配任何內容,因此符號、小數、分數和指數是可選的。
number = ( "" | "-" ) // optional sign
+ ( digits + ( "." + ( ( digits ) | "" ) | "" ) ) // leading digit not optional
+ ( ( ("E"|"e") + ( "" | "-" ) + digits ) | "" ) ; // another optional sign in the optional exponent
這是不是一種模式;引號很難看(它們需要轉義)所以創建一個變量
quote = "\!""; // nightmare -> thing of beauty
接下來是匹配引號中文本的模式;在裡面源文件文本(如下),嵌入的引號表示為兩個引號。 因此,這種模式需要更努力地確保成對的引號保持在一起。拍重複()將盡可能多次地重複其論點。拍打中斷()將匹配但不包括其參數。帕特倫()使用而不是“”只是為了炫耀它;它與請求的字符數匹配。 因此,文字以引號開頭和結尾,中間有一直到引號的字符。 請記住 patBreak 不包含引號...因此要么有兩個引號並重複一些,要么停止重複並找到最終的引號。
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
這個小模式匹配不同操作系統使用的各種行尾字符
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
示例輸入中的字段由逗號、文件開頭、文件結尾或換行符分隔。帕特位置()和帕特RPos()如果當前位置與參數匹配,則匹配零長度字符串。帕特RPPos(0)是字符串的右端。拍拍位置(0)是字符串的開頭。
endOfField = "," | newline | patPos(0) | patRPos(0);
這是要匹配的示例文本,使用特殊的括號轉義,因此引號不需要更多轉義。
sourcefile = "\[
-123.456e-78,"I said,""how are you?""",11,555-5555,"fine, thank you",3.1459,1.414
]\";
最後!一個 while 循環來查找模式並將其替換為逗號,每次打印找到的文本。 最後,顯示不匹配的文本。
while(patMatch(sourcefile, endOfField + (number | literal ) >? found + endOfField , ","),
write(found || "\!n") // display the found text and a newline
);
write( "Non matches: ", sourceFile, "\!n");
-123.456e-78
"I said,""how are you?"""
11
"fine, thank you"
3.1459
1.414
Non matches: ,555-5555,
>?運算符是模式內的條件賦值。 僅當模式成功且 patMatch() 返回 1 後才會進行賦值。 還有一個 >> 運算符,用於在文本匹配後立即進行賦值(如果模式匹配器必須備份並重試,則可能會進行多次。)
JSL 中的模式匹配還可以做其他有趣的事情,比如在單個語句中循環長字符串,這可能會加快原本緩慢的過程。 這帕特正則表達式()函數允許您使用正則表達式作為模式匹配的一部分。 腳本索引(來自“幫助”菜單)包含模式匹配函數和描述的列表。
2017 年 1 月 30 日更新:修復新社區的格式。