2016-12-09 4 views
5

私は、タイトルケースに変更する必要があるタイトルのリストを含むテキストファイルを持っています(単語は大文字、大文字、前置詞以外の大文字で始まる必要があります)。テキストを大文字に変換するにはどうすればよいですか?

例えば、本のタイトルのリスト:

barbarians at the gate 
hot, flat, and crowded 
A DAY LATE AND A DOLLAR SHORT 
THE HITCHHIKER'S GUIDE TO THE GALAXY 

は、次のように変更します。

Barbarians at the Gate 
Hot, Flat, and Crowded 
A Day Late and a Dollar Short 
The Hitchhiker's Guide to the Galaxy 

私は、次のコードを書いた:

while(<DATA>) 
{ 
    $_=~s/(\s+)([a-z])/$1.uc($2)/eg; 
    print $_; 
} 

をしかし、それは最初を大文字タイトルの真ん中にある "at"、 "the"、 "a"のようなすべての単語の文字:

Barbarians At The Gate 
Hot, Flat, And Crowded 
A Day Late And A Dollar Short 
The Hitchhiker's Guide To The Galaxy 

どうすればいいですか?

+2

も参照してください[Lingua :: EN :: Titlecase](https://metacpan.org/pod/Lingua::EN::Titlecase) –

+1

@HåkonHægland:Awesome私たちはそれを得た。 – ssr1012

答えて

1

また、この正規表現を使用して試すことができます:^(.)(.*?)\b|\b(at|to|that|and|this|the|a|is|was)\b|\b(\w)([\w']*?(?:[^\w'-]|$))\U$1\L$2\U$3\L$4と交換してください。それは、記事ではない単語の最初の文字にマッチして、それを大文字にしてから残りの単語にマッチさせます。これはPHPで動作するようですが、Perlについてはわかりませんが、うまくいくでしょう。

  • ^(.)(.*?)\bは、最初の単語(グループ1)の最初の文字と残りの単語(グループ2)と一致します。これは記事であるため、最初の単語を大文字にしないようにするために行われます。
  • \b(word|multiple words|...)\bは、接続文字を大文字に変換しないようにするための接続語と一致します。
  • (\w)([\w']*?(?:[^\w'-]|$))は単語(グループ3)の最初の文字と残りの単語(グループ4)と一致します。ここでは\bの代わりに[^\w'-]を使用したので、ハイフンとアポストロフィも単語文字としてカウントされます。これは、交換に\U'S

になってから'sを防ぐため、次の文字を大文字にして\Lは彼らを低下させます。あなたがそれらを大文字にすることを防ぐために、正規表現に記事や単語を追加することができます。

UPDATE:接続フレーズも含めることができるように正規表現を変更しました(複数の単語)。しかし、それはまだ非常に長い正規表現を作るでしょう...

+0

使用されている接続語が少なくなります。残念ながら私たちはもっと多くを持っています。 – ssr1012

+0

否定先読み '(?!word1 | word2 | word3 | ...) 'を追加できます。 –

+0

[こちらをご確認ください](http://www.smart-words.org/linking-words/transition-words .html) – ssr1012