助け合いフォーラム

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

参考

正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。

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


正規表現には次のような基本の概念があります。
・特殊文字
「|」や「\(エスケープ文字)」などのように特殊な意味を持つ文字のことです。

・文字クラス
「[ ]」内の文字集合のことです。

・数量詞
「*」や「+」などのように直前の文字の繰り返し回数を示す文字のことです。

・アンカー
「^」や「$」などのように文字列内での位置を示す文字のことです。

なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。

正規表現を利用する主なコマンドは以下のとおりです。

・grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
なお、「-E」オプションを併用すると拡張正規表現が使えます(egrepコマンドと同様)。

・sed
ファイルや標準入力の内容を編集して表示するコマンド

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

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

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

$ sed '/^#/d' test.txt

基本正規表現と拡張正規表現の違いに注意してください。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という検索パターンに該当してしまいます。 と言うのは起こり得ないんですね。

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

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