こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

英文の先頭の文字を大文字にしたいです

こんにちは、皆さん。

私は今、Perlプログラミングを勉強しています。
全て小文字で入力された複数の英文があり、これを先頭の文字を大文字にしたいと思います。
英文と言ってもいろいろなパターンがあると思いますが、質問したいのはごく基本的な形(行頭の英文字を大文字にする)というのが知りたいです。
WEBにも過去の質問にもありませんでしたので、どなたかご存知の方がいらっしゃったら教えてください。

よろしくお願い致します。

投稿日時 - 2005-12-16 14:25:29

QNo.1842493

困ってます

質問者が選んだベストアンサー

補足中の、

$_ =~ s/([smtwf].*day)/ucfirst($1)/eg;

ですが、'.'は改行以外のすべての文字とマッチしてしまうので、英数文字をあらわす'\w'で置き換え、

$_ =~ s/([smtwf]\w*day)/ucfirst($1)/eg;

とするのが正しいです。
(でもこれだとdayも引っかかるので、[smtwf]\w+day がいいでしょうね)

共通項であるdayをまとめるのなら、

$_ =~ s/\b((sun|mon|tues|wednes|thurs|fri|satur)day)\b/ucfirst($1)/eg;

という書き方でどうでしょうか。(\bは入れておいたほうがいいと思います)

また、置換項目を変数で管理したかったら、

@week = ('sun','mon','tues','wednes','thurs','fri','satur');
$line = "today is friday. tomorrow is saturday. the day next tomorrow is sunday.";

foreach $_(@week){
$line =~ s/\b(($_)day)\b/ucfirst($1)/eg;
}

とか。見栄えはよくなります。
(ここまでやるとdayをまとめるとかは考えなくてもいいですね)

投稿日時 - 2005-12-16 17:30:00

お礼

ご回答ありがとうございます。
配列変数で管理するとスッキリしますね。
曜日だけでなく、いろいろなところで応用が効きそうです。
いろいろ勉強になってよかったです。
将来的にはプログラマーになりたいと思っていますので、
また質問するときはよろしくお願いします。
ありがとうございました。

投稿日時 - 2005-12-16 18:57:31

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(6)

ANo.5

ちょっと複雑ですが、

$line =~ s/\b(\w*day)\b/ucfirst($1)/eg;

\bは単語の区切り(スペースや改行、タブ、ピリオド、コンマなど)、\wは英文字をあらわします。
単語と単語の区切りに囲まれ、"day"で終わる英単語の頭を大文字に変えます。

todayやyesterdayは個別に戻してやってください(^^;

投稿日時 - 2005-12-16 15:39:02

補足

早いご回答ありがとうございます。

試しにサンプルを作ってみたところ、次のような結果になりました。

----------------------------------------------------------------
#!/usr/bin/perl

$_ = "today is friday. tomorrow is saturday. the day next tomorrow is sunday.";

$_ =~ s/\b(\w*day)\b/ucfirst($1)/eg;

print $_ . "\n";
----------------------------------------------------------------

<<結果>>
Today is Friday. tomorrow is Saturday. the Day next tomorrow is Sunday.

やはりちょっと発展させて、sunday, monday, tuesday, … ,saturdayだけ、
変換するようにしようと思って、

$_ =~ s/([smtwf].*day)/ucfirst($1)/eg;

としてみたところ、行頭のtodayしか変換されませんでした。
(これだと、うまくいってもtodayが変換されてしまいますが…)

Today is friday. tomorrow is saturday. the day next tomorrow is sunday.

しかたないので、

$_ =~ s/((sunday|monday|tuesday|thursday|friday|saturday|^today))/ucfirst($1)/eg;

としてみたところ、うまく行きました。

<<結果>>
Today is Friday. tomorrow is Saturday. the day next tomorrow is Sunday.

でもこれだとちょっと見栄えが悪いので、もう少し何とかしたいです。
dayが共通なのでdayをまとめて、先頭にいろいろ入れられるようにして、
そこを変えるだけでいろんなパターンが変換できるようにしたいです。

度々申し訳ありませんが、これだけ最後に教えていただけませんか?

投稿日時 - 2005-12-16 16:24:29

ANo.4

行頭の文字だけを大文字にしたいのであれば、

# $lineは英文が1行分入っている
$line =~ s/^(.)/uc($1)/e;

先頭の一文字を大文字にする置換演算です。

投稿日時 - 2005-12-16 14:54:16

補足

ご回答ありがとうございます。
どうやら質問のしかたが悪かったようです。
教えていただいた方法で変換できることは確認できました。
実際にやりたかったことは次のようなことです。
例えば、英文の中にmonday、tuesdayなどが入っているとします。
これらを一括でmonday→Monday、tuesday→Tuesdayにしたかったんです。
monday、tuesdayは英文の中にランダムに入っていますので、
○○dayがあったら先頭を大文字にしたいです。
このさいtodayも大文字にしてしまった良いです。
(あとで同様の操作でTodayはtodayに戻せるはずなので。)

よろしくお願いします。

投稿日時 - 2005-12-16 14:59:54

ANo.3

こんにちは。

全て小文字で入力された複数の英文というのは、
一つの変数に複数の英文があるのか、ファイル1行毎に英文ができてるのか。
また一文と見るのはピリオドまでが一つの英文とするのか等。

その辺を明示すれば、良い回答が付くかもしれません。

ucfirstという関数を使えば先頭文字は大文字になります。
(どこが先頭かは判別できません。あくまで文字列の先頭が大文字になります)
例:
$test = "nice to meet you";

print $test;
print "<br>";
print ucfirst ( $test );

== 結果
nice to meet you
Nice to meet you

投稿日時 - 2005-12-16 14:49:57

お礼

質問のしかたが悪いのに、良いご回答をいただけたことに感謝します。
ucfirstでWEB検索したところ出てきました。ちゃんと関数が用意されているんですね。
uc関数についても載っていたのでさらに勉強になりました。
ありがとうございました。

投稿日時 - 2005-12-16 15:22:10

ANo.2

処理を順番に考えて行きます。

1.データを変数に入れる
2.データを単位で区切り、配列に格納(行頭なら改行コード、文節ならピリオド等々)
3.配列文処理を繰り返す
3-1.英文字1文字目をucで大文字変換

こんな感じでしょうか

投稿日時 - 2005-12-16 14:47:37

ANo.1

 私は、現在契約切れのフリーター(ほぼ無職)です。
30代の男性です。

 『Perl』のプログラムについては何も知りませんが・・・。

 行の先頭の文字を入力する時だけ、『Shift』キーを押しながら入力する・・・という方法ではダメでしょうか?

 違っていたらゴメンナサイ。

投稿日時 - 2005-12-16 14:36:35

あなたにオススメの質問