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"
これまでにパターンを見たことがない場合は、次のような奇妙な割り当てに戸惑うかもしれません。食品。 これらの単一の縦棒は「または」を意味します。 これらは、文字列を連結するための二重の垂直バーではありません。食品これらの4つの単語のいずれかに一致するパターン値です。 パターンを連結するための+演算子もあります(これは文字列を連結することと同じではありません)。 この例を強化しましょう:
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";
食べ物を見つけるための3つの別々の一致と、それに続く時刻(+を使用してパターンを連結します)。 簡単な手順で、より複雑なパターンを作成することもできます。
まず、数字のスパンに一致する小さなパターン
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
次は、引用符で囲まれたテキストと一致するパターンです。の中にソースファイルテキスト(下)、埋め込まれた引用符は2つの引用符として表されます。 したがって、このパターンは、引用符のペアが一緒に保持されるようにするために少し難しくなります。 patRepeat()可能な限りその議論を繰り返します。 patBreak()その引数に一致しますが、含まれません。 patLen()見せびらかすためだけに「」の代わりに使用されます。要求された文字数と一致します。 したがって、リテラルは引用符で開始および終了し、その間に引用符までの文字が実行されます。 patBreakには引用符が含まれていないことを忘れないでください...したがって、引用符が2つあり、さらに繰り返すか、繰り返しを停止して最終的な引用符を見つけます。
literal = quote + patRepeat( patBreak(quote) + ( ( quote + quote ) | patLen(0) ) ) + quote;
この小さなパターンは、さまざまなオペレーティングシステムで使用されるさまざまな行末文字と一致します
newline = "\!r\!n" | "\!r" | "\!n" | "\!N";
サンプル入力のフィールドは、コンマ、ファイルの先頭、ファイルの末尾、または改行で区切られます。 patPos()とpatRPos()現在の位置が引数と一致する場合は、長さがゼロの文字列と一致します。 patRPos(0)文字列の右端です。 patPos(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のパターンマッチングは、次のような他の興味深いことを行うことができます。 1つのステートメントで長い文字列をループする、それ以外の場合は遅いプロセスをスピードアップする可能性があります。 The PatRegex()関数を使用すると、パターン一致の一部として正規表現を使用できます。 スクリプトインデックス([ヘルプ]メニューから)には、パターンマッチング関数と説明のリストがあります。
2017年1月30日更新:新しいコミュニティのフォーマットを修復します。