助け合いフォーラム
LPIC Lv1-101(Ver5.0)
問題ID : 3574
問題を開く
以下の「test.txt」ファイルのうち、文字列「taro」にのみマッチするパターンを選びなさい。(全て選択)
$ cat test.txt
taro
jiro
saburo
hanako
sachiko
akiko
$ cat test.txt
taro
jiro
saburo
hanako
sachiko
akiko
正解
^t.*o$
^t..o$
解説
以下は主な正規表現とその使用例をまとめたものです。
選択肢の中で「taro」とマッチするのは、行頭が「t」、行末が「o」、その間は任意の文字列を表している「^t.*o$」です。
また、行頭が「t」、行末が「o」、その間は任意の2文字を表している「^t..o$」も「taro」にマッチします。
したがって正解は
・^t.*o$
・^t..o$
です。
以下はgrepコマンドの実行結果です。正規表現にマッチする文字列を含む行を抽出します。
$ cat test.txt
taro
jiro
saburo
hanako
sachiko
akiko
$
$ grep '^t.*o$' test.txt
taro
$ grep '^t..o$' test.txt
taro
その他の選択肢については以下のとおりです。
・[taro]
t,a,r,oのいずれか1文字にマッチしますので、誤りです。
$ grep '[taro]' test.txt
taro
jiro
saburo
hanako
sachiko
akiko
・^t*
行頭がt、もしくは行頭がtでない任意の文字列にマッチ(「*」は0回合致も含む)しますので、誤りです。
$ grep '^t*' test.txt
taro
jiro
saburo
hanako
sachiko
akiko
・^t..o\$
行頭がt、続けて任意の2文字、その後o$で終わる文字列にマッチしますので、誤りです。
\により、$が文字として認識されます。
$ grep '^t..o\$' test.txt
選択肢の中で「taro」とマッチするのは、行頭が「t」、行末が「o」、その間は任意の文字列を表している「^t.*o$」です。
また、行頭が「t」、行末が「o」、その間は任意の2文字を表している「^t..o$」も「taro」にマッチします。
したがって正解は
・^t.*o$
・^t..o$
です。
以下はgrepコマンドの実行結果です。正規表現にマッチする文字列を含む行を抽出します。
$ cat test.txt
taro
jiro
saburo
hanako
sachiko
akiko
$
$ grep '^t.*o$' test.txt
taro
$ grep '^t..o$' test.txt
taro
その他の選択肢については以下のとおりです。
・[taro]
t,a,r,oのいずれか1文字にマッチしますので、誤りです。
$ grep '[taro]' test.txt
taro
jiro
saburo
hanako
sachiko
akiko
・^t*
行頭がt、もしくは行頭がtでない任意の文字列にマッチ(「*」は0回合致も含む)しますので、誤りです。
$ grep '^t*' test.txt
taro
jiro
saburo
hanako
sachiko
akiko
・^t..o\$
行頭がt、続けて任意の2文字、その後o$で終わる文字列にマッチしますので、誤りです。
\により、$が文字として認識されます。
$ grep '^t..o\$' 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コマンドと同様)。
例)拡張正規表現「+」を使った抽出
なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
^は行頭を示す以外の意味がある表現でしょうか?
投稿日 2022/11/22
問題ID3574のうち、不正解の選択肢である
^t*
の解説がよくわかりませんでした。
行頭がt、もしくは行頭がtでない任意の文字列にマッチ(「*」は0回合致も含む)しますので、誤りです。
という解説がありましたが、^は行頭を示すのでもしくは行頭がtでない任意の文字列
というのには当てはまらないのでは?と思いました。
それとも^は行頭を示したり示さなかったりするのでしょうか?
([ ]内にある場合は[ ]内の文字列以外にマッチする、というのは理解しております。)
2022/11/22 18:37
^ は[ ]内にある場合を除き、常に行頭を示すという理解であっています。
誤解は「t*」のほうにあるようです。
「(「*」は0回合致も含む)」と補足されているように、「t*」というのはtを含んでいようといまいと、どんな文字列にもマッチします。
もし「行頭がtである任意の文字列」だけを表したい場合、その正規表現は「^t*」ではなく「^t.*」になります。
コメント
この投稿に対して返信しませんか?
t tsuyumi_s
2022/11/26 12:52
見落としておりました! *は直前の文字列の0回以上繰り返し=何でも良い文字列 と認識して良いでしょうか?