マナビングITパスポート

ワイルドカード検索で包含と末尾一致をどう見分けるか

ITパスポート試験 令和元年度秋期 問99 / 基礎理論 › 情報に関する理論

過去問にチャレンジ

令和元年度秋期 問99

ワイルドカードに関する次の記述中の a、b に入れる字句の適切な組合せはどれか。 任意の1文字を表す “?” と、長さゼロ以上の任意の文字列を表す “*” を使った文字列の検索について考える。( a )では、“データ” を含む全ての文字列が該当する。また、( b )では、“データ” で終わる全ての文字列が該当する。

令和元年度秋期 問99の図
  1. ア

    a:?データ*、b:?データ

  2. イ

    a:?データ*、b:*データ

  3. ウ

    a:*データ*、b:?データ

  4. エ

    a:*データ*、b:*データ

会話形式の解説

講師講師
「データ」を含む場合と「データ」で終わる場合では、語の前後に何文字を許すかに注目します。
受験者受験者
「?」も「*」も文字を置き換えるので、「データ」の前にはどちらを置いてもよさそうに見えます。
講師講師
「?」は必ず1文字、「*」は0文字以上を表します。「データ」だけの文字列を検索できるかで違いが分かります。
受験者受験者
「?データ*」は前に1文字必要なので、「データ」だけでは該当しませんね。
講師講師
そのとおりです。「データ」を含む全ての文字列には、前後とも0文字を許す「*データ*」が必要です。
受験者受験者
末尾を「データ」にする場合は、後ろに「*」を付けないのですね。前に置く記号はどう選びますか。
講師講師
前の文字数を0文字以上にできる「*」を置き、「*データ」とします。「?データ」では、前がちょうど1文字の場合しか該当しません。
受験者受験者
すると、「?データ*」と「?データ」の組合せは両方の条件に合いません。「?データ*」と「*データ」の組合せも、含む文字列を全て拾えませんね。
講師講師
はい。「*データ*」と「?データ」の組合せは、含む条件だけが合います。両方を満たすのは「*データ*」と「*データ」の組合せ、エです。
受験者受験者
「全て」とあるので、「データ」だけの場合も該当するかを確かめれば、「?」を選べないと分かります。
講師講師
その確認が有効です。語を含むなら前後に「*」、語で終わるなら前だけに「*」を置くと整理できます。

まとめ

「?」は任意の1文字に一致し、0文字には一致しません。「*」は0文字以上に一致するため、「データ」だけの文字列も含められます。「データ」を含む全ての文字列には「*データ*」、「データ」で終わる全ての文字列には「*データ」を使います。したがって正解はエです。

解答・解説

正解はエです

この問題のテーマ

ワイルドカード「?」と「*」の違いを理解し、文字列の包含と末尾一致に合う組合せを選ぶ問題です。

解き方の考え方

「?」は必ず1文字に一致し、「*」は0文字以上に一致します。「データ」だけの文字列も対象に含めるには、その前後に置く記号として「*」が必要です。末尾を「データ」に限定するには、後ろに記号を置きません。

選択肢ごとの解説

  1. ×ア  a:?データ*、b:?データ
    aの「?データ*」は「データ」の前に必ず1文字を要するため、「データ」だけの文字列が該当しません。bの「?データ」も前にちょうど1文字を要し、「データ」で終わる全ての文字列を表せません。
  2. ×イ  a:?データ*、b:*データ
    bの「*データ」は、前に0文字以上を置けるので条件に合います。しかし、aの「?データ*」は前に1文字が必要です。「データ」から始まる文字列を含められないため、組合せ全体では誤りです。
  3. ×ウ  a:*データ*、b:?データ
    aの「*データ*」は「データ」の前後に0文字以上を置けるので条件に合います。しかし、bの「?データ」は前にちょうど1文字が必要で、全ての末尾一致を表せません。
  4. ○エ  a:*データ*、b:*データ
    aの「*データ*」は、「データ」が先頭・途中・末尾のどこにあっても該当します。bの「*データ」は前に任意の長さの文字列を置けますが、末尾は必ず「データ」になります。したがって、両方の条件を満たすエが正解です。

補足

「全て」という条件では、「データ」だけの文字列も該当するかを確かめると判断しやすくなります。前に「?」を置くと、この文字列は該当しません。

POINT

  • 「?」は任意の1文字を表し、0文字には一致しません。
  • 「*」は0文字以上を表すので、文字がない場合も含みます。
  • ある語を含む全ての文字列は、その語の前後に「*」を置いて表します。
  • ある語で終わる全ての文字列は、その語の前だけに「*」を置いて表します。

※出典:令和元年度秋期 ITパスポート試験 問99(一部改変)