-6

私はこのような文字列を持っています:

「レッド ブルー グリーン ダーク グレー パープル」

そして、私は出力する関数が欲しい:

「赤、青、緑、ダークグレー、紫」

大文字の最初の文字が隣り合っている単語を1つのタグとして、3、4、5 ... 単語が隣り合って大文字になっているのと同じことをしたい。

もう一つの例:

「レモン オレンジ アップル おいしいブラック ベリー」 ==> 「レモン、オレンジ、リンゴ、おいしいブラック ベリー」

4

1 に答える 1

2

ええ、それは悪い質問ですが、それは私にとって良い挑戦のように思えました。この正規表現を使用できます。

/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/

そしてPHPコード:

$string = 'red blue green Dark Grey purple';
preg_match_all('/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/', $string, $ans);

print_r($ans[0]); /*  Array
                   *  (
                   *    [0] => red
                   *    [1] => blue
                   *    [2] => green
                   *    [3] => Dark Grey
                   *    [4] => purple
                   *  )                     
                   */

$string = 'lemon orange apple Delicious Black Berry';
preg_match_all('/(([A-Z][a-z]* ?)+?(?= |$))|([a-z]+)/', $string, $ans);

print_r($ans[0]); /*  Array
                   *  (
                   *    [0] => lemon
                   *    [1] => orange
                   *    [2] => apple
                   *    [3] => Delicious Black Berry
                   *  ) 
                   */

正規表現の説明。これは2つの部分に分かれています。大文字で始まる単語を探す(([A-Z][a-z]* ?)+?(?= |$))部分と小文字の単語を探す部分([a-z]+)。そこで、大文字の部分から2つに分けて説明します。

  • (([A-Z][a-z]* ?)+?(?= |$)) Explanation
  • ([A-Z][a-z]* ?)+?-([大文字に一致] [0個以上の小文字が続く](スペースまたは何も続かない)少なくとも1回、ただしパターンに一致する可能性のある最小量
  • (?= |$)-(一致しませんが、次の文字がスペースまたは文字列の終わりであることを確認してください)

一致するものがない場合は、次のことを試みます。

  • ([a-z]+) Explanation
  • ([a-z]+)-[少なくとも1つの小文字にできるだけ多く一致します]

楽しみ。:)

于 2012-09-26T17:26:40.780 に答える