助け合いフォーラム
$ 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オプションを付けないと検索パターンを基本正規表現と判断しますので、上表の拡張正規表現が使えません。
実行例)
基本正規表現では「?, +」は「\?, \+」とすることで、拡張正規表現と同様の意味を持つようになります。
正規表現を使用したテキストファイルの検索
問題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の行とのみマッチすると考えていましたが違ったのでその理由が知りたいです。
^15$はそれぞれ行頭と行末が1と5という条件なので
12345の行とのみマッチすると考えていましたが違ったのでその理由が知りたいです。
^15$
だと「15」しかマッチしないんですね。
12345とマッチするには「行頭が1」「234とマッチする何か」「行末が5」じゃないとダメなんです。
コメント
この投稿に対して返信しませんか?
u unbernew
2022/09/01 15:51
行頭と行末だけが一致していても、その間の部分にマッチする条件がなければいけないんですね。間の部分は補完されて検索されると誤認していました。(1245,12245……のように、行頭と行末さえ指定していればこれらにも全てマッチするのかと思っていました)。理解できました、ありがとうございます。