助け合いフォーラム

LinuC

LinuC Lv1-101(Ver10.0)
問題ID : 14536
問題を開く
以下の「test.txt」ファイルのうち、「123」の行とのみマッチする正規表現はどれか。(2つ選択)

正解

^1.*3$

[^2-3]23$

解説

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


上表より、選択肢「^1.*3$」は、行頭が「1」、行末が「3」、その間は「.*」により任意の文字列の繰り返しを表しています。
また、「[^2-3]23$」は、「2から3以外の1文字」に続けて、「2」、さらに行末が「3」であることを表します。
これらの正規表現が「123」の行にのみマッチします。

したがって正解は
・^1.*3$
・[^2-3]23$
です。

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


その他の選択肢については以下のとおりです。

・^1.*3
行頭が「1」、その後に「.*」により任意の文字列の繰り返しに続く「3」を含む文字列とマッチしますが、行末を意味する「$」が指定されていないことにより他の行にもマッチするため誤りです。


・[1-3]
1から3までのいずれかの1文字にマッチしますので、誤りです。


・^13$
行頭が「1」で、行末が「3」の指定ですが、間に文字のない「13」のみの行にマッチしますので、誤りです。
また、設問のファイル内にこのような行はありません。

参考

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

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


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

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

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

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

例2)「test.txt」ファイルの空行を削除して出力する場合
 $ sed '/^$/d' test.txt
※正規表現では「^」は行頭、「$」は行末の意味であるため、「^」と「$」の間に文字を挟まずつなげることで、文字が存在しない行(空行)を表します。

■grep
ファイルや標準入力から、検索パターンにマッチする文字列を含む行を抽出するコマンド

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

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

grepコマンドは、-Eオプションを付けない場合は検索パターンを基本正規表現と判断します。
grepコマンドの検索パターンで拡張正規表現を使うには、-Eオプションを指定します(egrepコマンドと同様)。
例)拡張正規表現「+」を使った抽出


なお、拡張正規表現の「?」「+」は、基本正規表現では「\?」「\+」で同様の指定ができます。
例)基本正規表現で「+」を扱う場合
上に戻る

正規表現を使用したテキストファイルの検索

投稿日 2022/09/01

問題ID :14536 正規表現を使用したテキストファイルの検索

以下の「test.txt」ファイルのうち、「12345」の行とのみマッチする正規表現はどれか。(全て選択)

$ cat test.txt
1
12
123
1234
12345

選択肢
[1-5]
1...5
1[2-5]
^15$
[^1-5]
^1.*5$

正解
^1.*5$
1...5

^15$はそれぞれ行頭と行末が1と5という条件なので
12345の行とのみマッチすると考えていましたが違ったのでその理由が知りたいです。

2022/09/01 13:48

^15$はそれぞれ行頭と行末が1と5という条件なので
12345の行とのみマッチすると考えていましたが違ったのでその理由が知りたいです。

^15$ だと「15」しかマッチしないんですね。
12345とマッチするには「行頭が1」「234とマッチする何か」「行末が5」じゃないとダメなんです。


コメント

u unbernew

2022/09/01 15:51

行頭と行末だけが一致していても、その間の部分にマッチする条件がなければいけないんですね。間の部分は補完されて検索されると誤認していました。(1245,12245……のように、行頭と行末さえ指定していればこれらにも全てマッチするのかと思っていました)。理解できました、ありがとうございます。

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

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