スクリプトガイド > データタイプ > パターンマッチ > パターンのトラブルシューティング
公開日: 04/01/2021

パターンのトラブルシューティング

パターンが思うように動作しないときは、Log()を使って、マッチしている部分をJMPログに出力してください。次の例は、パターンマッチングをデバッグし、スクリプトを書き換えて、「the quick brown fox」というフレーズの単語間の空白を考慮する方法を示しています。

// 空白を除く1つ以上の文字の貪欲なマッチ

word = Pat Repeat( Pat Not Any( " " ) );
 
Pat Match(
	"the quick brown fox",
	word >> a +
	word >> b +
	word >> c +
	word >> d
);
 
Show( a, b, c, d );

a = "qu";

b = "i";

c = "c";

d = "k";

パターンwordの内容を考えれば、出力はおそらくあなたが望むものではないでしょう。パターン内の単語はどれも一致しませんでした。

Show( a, b, c, d )の式は、最初の良いステップになります。それを見てもJMPがどのようにその答えを得たかがわからない場合は、Log()を以下のように挿入してみてください。

word = Pat Repeat( Pat Not Any( " " ) );
 
Pat Match(
	"the quick brown fox",
	(word >> a) >> Log( "a" ) 	+
	(word >> b) >> Log( "b" ) +
	(word >> c) >> Log( "c" ) +
	(word >> d) >> Log( "d" )
);
 
Show( a, b, c, d );

0(a) the(数値0はマッチした位置)

0(a) th(「a」はログに与えた任意の識別子)

2(b) e

...

4(a) quick

4(a) quic

...

この情報により、マッチの仕組み、少なくとも最初に単語パターンがどのように単語にマッチするかを理解できます。しかし、その後、次の単語パターンが空白以外の文字と一致するように、後退してより小さな部分とマッチしようとします。ただし、このパターンは単語間の空白にはマッチしません。そして、実際に空白以外の文字からなる4つの連続した語を見つけました。次のスクリプトのほうがよさそうです。

word = Pat Repeat( Pat Not Any( " " ) );
gap = Pat Repeat( Pat Any( " " ), 1, 999, GREEDY );
 
Pat Match(
	"the quick brown fox",
	word >> a + gap +
	word >> b + gap +
	word >> c + gap +
	word >> d
);
 
Show( a, b, c, d );

a = "the";

b = "quick"

c = "brown";

d = "fox";

より詳細な情報が必要な場合や、質問があるときは、JMPユーザーコミュニティで答えを見つけましょう (community.jmp.com).