我有一个这样的字符串:
《红蓝绿深灰紫》
我想要一个输出的函数:
“红、蓝、绿、深灰、紫”
我希望彼此相邻的第一个大写字母的单词作为一个标签,同样的东西有 3、4、5 ......
另一个例子:
“柠檬橙苹果美味黑莓”==>“柠檬、橙子、苹果、美味黑莓”
我有一个这样的字符串:
《红蓝绿深灰紫》
我想要一个输出的函数:
“红、蓝、绿、深灰、紫”
我希望彼此相邻的第一个大写字母的单词作为一个标签,同样的东西有 3、4、5 ......
另一个例子:
“柠檬橙苹果美味黑莓”==>“柠檬、橙子、苹果、美味黑莓”
是的,这是一个糟糕的问题,但这对我来说似乎是一个很好的挑战。您可以使用此正则表达式。
/(([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 个小写字母]享受。:)