-6

我有一个这样的字符串:

《红蓝绿深灰紫》

我想要一个输出的函数:

“红、蓝、绿、深灰、紫”

我希望彼此相邻的第一个大写字母的单词作为一个标签,同样的东西有 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
                   *  ) 
                   */

正则表达式的解释。这分为两部分。一部分查找以大写字母开头的单词,(([A-Z][a-z]* ?)+?(?= |$))另一部分查找小写单词([a-z]+)。因此,我将从大写字母部分开始分两部分进行解释。

  • (([A-Z][a-z]* ?)+?(?= |$)) Explanation
  • ([A-Z][a-z]* ?)+?- ([匹配大写字母] [后跟 0 个或多个小写字母](后跟空格或什么都没有)至少一次,但与模式匹配的数量最少
  • (?= |$)- (不匹配但确保下一个字符是空格或字符串的结尾)

如果没有匹配项,它将尝试以下操作:

  • ([a-z]+) Explanation
  • ([a-z]+)- [尽可能多次匹配至少 1 个小写字母]

享受。:)

于 2012-09-26T17:26:40.780 回答