ワイルドカード検索で包含と末尾一致をどう見分けるか
ITパスポート試験 令和元年度秋期 問99 / 基礎理論 › 情報に関する理論
過去問にチャレンジ
ワイルドカードに関する次の記述中の a、b に入れる字句の適切な組合せはどれか。 任意の1文字を表す “?” と、長さゼロ以上の任意の文字列を表す “*” を使った文字列の検索について考える。( a )では、“データ” を含む全ての文字列が該当する。また、( b )では、“データ” で終わる全ての文字列が該当する。

- ア
a:?データ*、b:?データ
- イ
a:?データ*、b:*データ
- ウ
a:*データ*、b:?データ
- エ
a:*データ*、b:*データ
会話形式の解説
講師「データ」を含む場合と「データ」で終わる場合では、語の前後に何文字を許すかに注目します。
受験者「?」も「*」も文字を置き換えるので、「データ」の前にはどちらを置いてもよさそうに見えます。
講師「?」は必ず1文字、「*」は0文字以上を表します。「データ」だけの文字列を検索できるかで違いが分かります。
受験者「?データ*」は前に1文字必要なので、「データ」だけでは該当しませんね。
講師そのとおりです。「データ」を含む全ての文字列には、前後とも0文字を許す「*データ*」が必要です。
受験者末尾を「データ」にする場合は、後ろに「*」を付けないのですね。前に置く記号はどう選びますか。
講師前の文字数を0文字以上にできる「*」を置き、「*データ」とします。「?データ」では、前がちょうど1文字の場合しか該当しません。
受験者すると、「?データ*」と「?データ」の組合せは両方の条件に合いません。「?データ*」と「*データ」の組合せも、含む文字列を全て拾えませんね。
講師はい。「*データ*」と「?データ」の組合せは、含む条件だけが合います。両方を満たすのは「*データ*」と「*データ」の組合せ、エです。
受験者「全て」とあるので、「データ」だけの場合も該当するかを確かめれば、「?」を選べないと分かります。
講師その確認が有効です。語を含むなら前後に「*」、語で終わるなら前だけに「*」を置くと整理できます。
まとめ
「?」は任意の1文字に一致し、0文字には一致しません。「*」は0文字以上に一致するため、「データ」だけの文字列も含められます。「データ」を含む全ての文字列には「*データ*」、「データ」で終わる全ての文字列には「*データ」を使います。したがって正解はエです。
解答・解説
正解はエです
この問題のテーマ
ワイルドカード「?」と「*」の違いを理解し、文字列の包含と末尾一致に合う組合せを選ぶ問題です。
解き方の考え方
「?」は必ず1文字に一致し、「*」は0文字以上に一致します。「データ」だけの文字列も対象に含めるには、その前後に置く記号として「*」が必要です。末尾を「データ」に限定するには、後ろに記号を置きません。
選択肢ごとの解説
- ×ア a:?データ*、b:?データaの「?データ*」は「データ」の前に必ず1文字を要するため、「データ」だけの文字列が該当しません。bの「?データ」も前にちょうど1文字を要し、「データ」で終わる全ての文字列を表せません。
- ×イ a:?データ*、b:*データbの「*データ」は、前に0文字以上を置けるので条件に合います。しかし、aの「?データ*」は前に1文字が必要です。「データ」から始まる文字列を含められないため、組合せ全体では誤りです。
- ×ウ a:*データ*、b:?データaの「*データ*」は「データ」の前後に0文字以上を置けるので条件に合います。しかし、bの「?データ」は前にちょうど1文字が必要で、全ての末尾一致を表せません。
- ○エ a:*データ*、b:*データaの「*データ*」は、「データ」が先頭・途中・末尾のどこにあっても該当します。bの「*データ」は前に任意の長さの文字列を置けますが、末尾は必ず「データ」になります。したがって、両方の条件を満たすエが正解です。
補足
「全て」という条件では、「データ」だけの文字列も該当するかを確かめると判断しやすくなります。前に「?」を置くと、この文字列は該当しません。
POINT
- 「?」は任意の1文字を表し、0文字には一致しません。
- 「*」は0文字以上を表すので、文字がない場合も含みます。
- ある語を含む全ての文字列は、その語の前後に「*」を置いて表します。
- ある語で終わる全ての文字列は、その語の前だけに「*」を置いて表します。
