匹配至少一个小写字母和至少一个大写字母
问题描述:
我试图用一个约束来提取单词[a-zA-Z]+
:一个单词必须包含至少一个小写字母和至少一个大写字母(在任意位置这个单词)。例如:如果输入是hello 123 worLD
,唯一的匹配应该是worLD
。匹配至少一个小写字母和至少一个大写字母
我试图用积极的向前看符号是这样的:
echo "hello 123 worLD" | grep -oP "(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+"
hello
这是不正确的:唯一的比赛是hello
,而不是worLD
。然后我试过这个:
echo "hello 123 worLD" | grep -oP "\K((?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+)"
hello
worLD
这仍然是不正确的:hello
不应该匹配。
答
在lookaheads中的.*
不仅在相邻的单词中检查信件的存在,而且在后面的字符串中检查信件的存在。使用[a-zA-Z]*
:
echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+"
我也开始添加一个单词边界\b
,使先行检查是一个字边界后,才执行。
答
答:
echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*"
说明:如果字与一个或多个大写字母后跟一个小写字母开始
首先检查反之亦然跟随以任意数量的小写字母和大写字母按任意顺序排列。
性能:
This solution需要31个步骤,以达到所提供的测试字符串匹配,而accepted solution需要47个步骤。