
出典:公益社団法人 日本技術士会「技術士第一次試験 過去問題」
正規表現(a*(ab)*|c)*ad*で表される文字列のうち、最も不適切なものを選ぶ問題。*は0回以上の繰返し、|は選択を表す。
正規表現が表す言語の構造(先頭部分は、a、ab、cの繰返し、末尾は a と d の0回以上の繰返し)を理解して、文字列が一致するかを判定する問題。
① 形を読む: (a*(ab)*|c)* は a・b・c だけの部分、その後に a、最後に d* → d は末尾にしか出てこない
② ④ abacadad は途中の d の後に a が来ていて、この形にならない。他は「a・b・cの部分+a+dの並び」に分けられる
③ ④
正規表現は、(a*(ab)*|c)*、a、d*の連結である。前半の括弧の中は、a、ab、cで作られる文字列(dは含まない)で、末尾は、aの後にdが0回以上続く。したがって、文字列は、(a、b、cのみの部分)+a+d*の形でなければならず、dが途中に現れることはない。④のabacadadは、途中にdがあり(abaca|d|ad)、dより前の部分に、dの後に更に、a と d が続く形になっていて、この形に合わない。したがって④が最も不適切である。
正規表現の判定では、文字列を先頭から、各部分表現に対応づけて分割してみる。ここでは、d は最後の d* にしか現れないので、dの後にa やb が現れる文字列は、一致しない。
キーワード: 正規表現、文字列照合、繰返し、選択、形式言語、オートマトン、情報工学部門