Perlの正規表現について

[上に] [前に] [次に]
asap [E-Mail] 2000/03/29(水) 10:06:54
こんにちは
初心者なもので、Perlの正規表現について質問させてください。
$contentsという変数の中に

名前=AAA
生年月日=
住所=BBB

というデータがあった場合、=の後にデータのない行を削除するには、

$contents=~ s/^\.\+=\n//g;

では間違いでしょうか。

初歩的な質問ですみませんが、よろしくお願いします。

javaka 2000/03/29(水) 10:34:35
$contents=~ s/.*=\n//g; でしょう。

文字列でない「.」とか「+」はエスケープしちゃだめでしょう。

Syn [E-Mail] 2000/03/29(水) 10:41:58
削除とゆうか、空行になってしまうのではないかと思いました。

$contents=~ s/^.+=\n//g;

よりは

$contents=~ s/^[^=]+=$//g;

のほうがいいような気が。

S-pore [HomePage] 2000/03/29(水) 10:52:58
> $contentsという変数の中に
> 名前=AAA
> 生年月日=
> 住所=BBB
> というデータがあった場合

というのが,
$contents = "名前=AAA\n生年月日=\n住所=BBB\n";
という意味なのなら,デフォルトで「^」ではまずいような気がします。
(文字列の先頭にしかマッチしなかったはずなので)

$contents =~ s/^.+\=\n//mg;

元のを生かすならこんな感じだと思います。
でも javaka さんのやり方のほうがスマートでいいですね。

Syn [E-Mail] 2000/03/29(水) 10:59:01
あ、そうか。 @contents じゃないのですね。
上のわたしのは無視してください。 すみません。

asap [E-Mail] 2000/03/29(水) 11:12:07
[[解決]]
javaka さんの方法で解決しました。助かりました。
Syn さん、S-pore さん、ありがとうございました。

+とか*とかの文字はどういう場合にエスケープしないと
いけないのかなど、もっと勉強しないといけないですね。

asap [E-Mail] 2000/03/29(水) 11:12:21
[[解決]]
javaka さんの方法で解決しました。助かりました。
Syn さん、S-pore さん、ありがとうございました。

+とか*とかの文字はどういう場合にエスケープしないと
いけないのかなど、もっと勉強しないといけないですね。

2000/03/29(水) 11:26:51
>$contents=~ s/.*=\n//g; でしょう。
gは必要なのでしょうか?

javaka 2000/03/29(水) 13:49:26
>gは必要なのでしょうか?
今回は必要ないです。
なんたってデータが3つでマッチが一つですから...。

しかし、普通は多数のケースがほとんどですので、gをつけたほうがいいです。
つけれは、全行対象で、つけなければ、はじめの一つのみ対象です。

yoru 2000/03/29(水) 14:06:06
>+とか*とかの文字はどういう場合にエスケープしないと
>いけないのかなど、もっと勉強しないといけないですね。
<B>文字</B>として使用したい場合はエスケープするべき、
<B>メタ文字</B>として使用したい場合はエスケープしてはいけない。

追加発言 2000/03/29(水) 14:08:30
>今回は必要ないです。
>なんたってデータが3つでマッチが一つですから...。
いんや〜
多分ループでデータが1行ずつ入ってくる処理なんだと思うぞ。

なりきり 2000/03/29(水) 18:08:30
スクリプトをたぶんforeachで処理してるんでしょうけど、データ=値という形であればhashを利用したほうが無難だと思いますよ。なんせ、処理が早くなるし、データのメンテナンスもしやすくなるしぜひおためしあれ。

[上に] [前に] [次に]