助け合いフォーラム
LPIC Lv1-101(Ver5.0)
問題ID : 3201
問題を開く
以下の「test.txt」ファイルのうち、「12345」の行とのみマッチする正規表現はどれか。(全て選択)
$ cat test.txt
1
12
123
1234
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
選択肢の中で「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文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
正規表現とは、文字列の特定のパターンを認識する為に使用する表現方法です。文字列の検索や置換などを行う際に利用します。正規表現には基本正規表現(BRE: Basic Regular Expression)と拡張正規表現(ERE: Extended Regular Expression)があります。
以下は主な正規表現とその使用例をまとめたものです。
正規表現には次のような基本の概念があります。
・特殊文字
「|」や「\(エスケープ文字)」などのように特殊な意味を持つ文字のことです。
・文字クラス
「[ ]」内の文字集合のことです。
・数量詞
「*」や「+」などのように直前の文字の繰り返し回数を示す文字のことです。
・アンカー
「^」や「$」などのように文字列内での位置を示す文字のことです。
なお、正規表現の「*」と、シェルによって解釈されるメタキャラクタの「*」では意味が異なるので注意してください。シェルは「*」を0文字以上の文字列と解釈します。
正規表現は明示的に「'」(シングルクォーテーション)や「"」(ダブルクォーテーション)の引用符で囲う事ができます。これらの引用符で囲まれた正規表現の記号は、シェルにメタキャラクタとして扱われなくなります。
正規表現を利用する主なコマンドには「sed」「grep」があります。
■sed
ファイルや標準入力の内容を編集して表示するコマンド
例)「test.txt」ファイルの「#」から始まる行を削除して出力する場合
$ sed '/^#/d' test.txt
■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド
例)1から5までのいずれかの文字がある行を「test.txt」ファイルから抽出する場合
$ grep '[1-5]' test.txt
[基本正規表現と拡張正規表現]
基本正規表現と拡張正規表現の違いに注意してください。
grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
回答と正規表現の解説の矛盾について
Y
YP1997
投稿日 2024/06/05
この設問に対しての今の正規表現の解説だと
^15$も12345という検索パターンに該当してしまいます。
理由としては、^の解説は「^1の場合、行頭が1から始まる行」、$の解説は「5$の場合、末5で終わる行」とすると
行頭が1で末尾が5で終わる行となりますので、12345の行があればヒットしてしまうことになります。
y
yklv
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という検索パターンに該当してしまいます。 と言うのは起こり得ないんですね。