我有一个这样的字符串:
“红蓝绿深灰紫”
我希望输出一个函数:
“红色,蓝色,绿色,深灰色,紫色”
我想要将大写第一个字母彼此相邻的单词作为一个标签,同样的东西是3,4,5 ......单词旁边一个大写的。
另一个例子:
“柠檬橙苹果美味黑莓”==> “柠檬,橘子,苹果,美味的黑莓”
答案 0 :(得分: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个小写字母] 享受。 :)