Re: 問題ID: 34214

この質問の投稿一覧へ

なし Re: 問題ID: 34214

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿なし | 投稿日時 2020-8-7 11:51
arashi1977  長老 居住地: 広島  投稿数: 1715
引用:
下記の問題に関して、問題文が「taro」か「hanako」
だったら納得できるのですが、問題文が「taro」と「hanako」表記でこの回答になるのが納得できません。「|」は左右どちらかの文字列を取得する拡張正規表と認識していたのですが、誤っているのでしょうか?
「左右どちらかの文字列を取得する」ということは「どちらかしか取得されない」という話になってしまいますよね。

じゃあってことで別の例でやってみると
$ cat test.txt
a
b
c
d
e
$ egrep 'a|c' test.txt
a
c
演算子の両側の文字列が結果として出てます。これはまぁ a か c のどちらかが出るのでおかしくないでしょう。

しかし、このパターンだと
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'a|c' test2.txt
abcde
abcdeが出ます。ac以外の文字(bde)がどうして出るの?って疑問が生まれるようだと、(e)grep の挙動を誤解しています。

正規表現で「文字列1|文字列2 → 文字列1、文字列2のどちらかにマッチする」のは間違いないのですが、(e)grepではその正規表現をつかって行ごとに判定するのです。
なので34214の設問でいうと、「egrep 'taro|hanako' test.txt」とすると
taro ← taro にマッチするので、結果として出力する
hanako ← hanako にマッチするので、結果として出力する
jiro ← taro にも hanako にもマッチしないので出力しない
sachiko ← 同上
saburo ← 同上
emiko ← 同上
となります。そして、私が2つ目に例示したものを使うと
$ cat test2.txt
abcde
fghij
klmno
$ egrep 'e|f' test2.txt
abcde ← e にマッチするので、結果として出力する
fghij ← f にマッチするので結果として出力する
(klmnoの行はどちらにもマッチしないので出ない)
となります。

「行ごとに、マッチする文字列があるか」という観点でもう一度見直してみてください。

投稿ツリー

  >フォーラム検索へ


Copyright (c) 2020 Ping-t All rights reserved.