2016-08-11 200 views
5

我试图用一个约束来提取单词[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不应该匹配。

回答

4

在lookaheads中的.*不仅在相邻的单词中检查信件的存在,而且在后面的字符串中检查信件的存在。使用[a-zA-Z]*

echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+" 

demo online

我也开始添加一个单词边界\b,使先行检查是一个字边界后,才执行。

1

答:

echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*" 

演示:https://ideone.com/HjLH5o

说明:如果字与一个或多个大写字母后跟一个小写字母开始

首先检查反之亦然跟随以任意数量的小写字母和大写字母按任意顺序排列。

性能:

This solution需要31个步骤,以达到所提供的测试字符串匹配,而accepted solution需要47个步骤。

相关问题