助け合いフォーラム

LPIC

LPIC Lv1-101(Ver5.0)
問題ID : 3201
問題を開く
以下の「test.txt」ファイルのうち、「12345」の行とのみマッチする正規表現はどれか。(全て選択)

$ cat test.txt
1
12
123
1234
12345

正解

^1.*5$

1...5

解説

以下は主な正規表現とその使用例をまとめたものです。


選択肢の中で「12345」とのみマッチするのは、行頭が「1」、行末が「5」、その間は任意の文字列を表している「^1.*5$」です。
また、「1」と「5」の間に任意の3文字を含む「1...5」も「12345」とのみマッチします。

したがって正解は
・^1.*5$
・1...5
です。

以下はgrepコマンドの実行結果です。正規表現にマッチする文字列を含む行を抽出します。

$ grep '^1.*5$' test.txt
12345
$ grep '1...5' test.txt
12345

その他の選択肢については以下のとおりです。
・[1-5]
1から5までのいずれかの文字にマッチしますので、誤りです。

$ grep '[1-5]' test.txt
1
12
123
1234
12345

・1[2-5]
1の次の文字が、2から5までのいずれかの1文字という文字列にマッチしますので、誤りです。

$ grep '1[2-5]' test.txt
12
123
1234
12345

・^15$
行頭が1で、行末が5の文字(15)にマッチする正規表現ですので、誤りです。また、「test.txt」にマッチする行はありません。

$ grep '^15$' test.txt

・[^1-5]
1から5以外の1文字にマッチする正規表現ですので、誤りです。また、「test.txt」にマッチする行はありません。

$ grep '[^1-5]' test.txt

参考

【正規表現】
正規表現とは、文字列の特定のパターンを認識するために使用する表現方法です。文字列の検索や置換などを行う際に利用します。
正規表現には基本正規表現と拡張正規表現があります。正規表現には基本正規表現と拡張正規表現があります。拡張正規表現では、特別な意味を持つ記号を基本正規表現よりも多く使用でき、複雑な検索パターンをより簡潔に記述できます。
検索パターンとは、探したい文字列の条件を表したものです。また、検索パターンの条件に当てはまることをマッチ、条件に合う行だけを取り出すことを抽出といいます。

以下は主な正規表現とその使用例をまとめたものです。


なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は、「'」(シングル・クォーテイション)や「"」(ダブル・クォーテイション)で囲めます。囲むと、正規表現の記号がシェルのメタキャラクタとして解釈されなくなります。

正規表現を利用する主なコマンドには「sed」「grep」があります。

■sed
sedは、ファイルや標準入力の内容を編集して表示するコマンドです。
書式と主なオプション・編集コマンドは以下のとおりです。sedコマンドでは、編集コマンドの「s」や「d」などを指定することで置換や削除などを行います。

sed [オプション] 編集コマンド [ファイル名]
sed [オプション] -e 編集コマンド1 [-e 編集コマンド2 ...] [ファイル名]
sed [オプション] -f スクリプト [ファイル名]


例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
 $ sed '/^#/d' test.txt

■grep
grepは、ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンドです。
書式と主なオプションは以下のとおりです。

grep [オプション] 検索パターン [ファイル名]


例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
 $ grep '[1-5]' test.txt

[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。

grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します。

例)拡張正規表現「+」を使った抽出


なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」とすることで拡張正規表現と同様の意味になります。
例)基本正規表現で「+」を扱う場合
上に戻る

回答と正規表現の解説の矛盾について

投稿日 2024/06/05

この設問に対しての今の正規表現の解説だと
^15$も12345という検索パターンに該当してしまいます。
理由としては、^の解説は「^1の場合、行頭が1から始まる行」、$の解説は「5$の場合、末5で終わる行」とすると
行頭が1で末尾が5で終わる行となりますので、12345の行があればヒットしてしまうことになります。

2024/06/06 10:46

表は特徴が短くまとめられたものですので、状況に応じた答えは、各設問の正答・誤答の解説文を読む形になるかと思います。

この問題では、「^15$」専用の誤答解説文が用意されており、そこに「(15)にマッチする正規表現」と記載されています。
・誤答の解説文

・^15$
行頭が1で、行末が5の文字(15)にマッチする正規表現ですので、誤りです。また、「test.txt」にマッチする行はありません。

また、誤答「^15$」を選ぶ方は正答「^1.*5$」と見比べ、正答の解説文も読まれるはずなので
「^15$は1と5の間に任意の文字列も何もないから、この状況では不適切」なことは伝わるように思われます。
・正答の解説文

選択肢の中で「12345」とのみマッチするのは、行頭が「1」、行末が「5」、その間は任意の文字列を表している「^1.*5$」です。


コメント

a arashi1977

2024/06/09 00:06

yklvさんの返信&ping-tさんの解説に補足すると、「^15$」って「行頭に1が来て、続いて5が来て、その次に行末がある」なのですよね。 「1に続けて5」と言う時点で、間に何も入ることはできないので > ^15$も12345という検索パターンに該当してしまいます。 と言うのは起こり得ないんですね。

この返信に対して
コメントを記入できます

この投稿に対して返信しませんか?