匹配至少一个小写字母和至少一个大写字母

usu*_* me 5 regex grep regex-lookarounds

我试图[a-zA-Z]+用一个约束提取单词:一个单词必须包含至少一个小写字母和至少一个大写字母(在单词内的任何位置).示例:如果输入hello 123 worLD,则唯一匹配应该是worLD.

我尝试使用这样的正向前瞻:

echo "hello 123 worLD" | grep -oP "(?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+"
hello
Run Code Online (Sandbox Code Playgroud)

这是不正确的:唯一的匹配是hello代替worLD.然后我尝试了这个:

echo "hello 123 worLD" | grep -oP "\K((?=.*[a-z])(?=.*[A-Z])[a-zA-Z]+)"
hello
worLD
Run Code Online (Sandbox Code Playgroud)

这仍然是错误的:hello不应该匹配.

Wik*_*żew 4

前瞻中的.*不仅检查相邻单词中的字母是否存在,而且还检查字符串中后面的字母。使用[a-zA-Z]*

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

在线查看演示

\b我还在开头添加了一个字边界,以便仅在字边界之后执行先行检查。