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

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
2个回答

4
在lookahead中的.*不仅检查相邻单词中的字母,还会在字符串后面检查字母的存在。请使用[a-zA-Z]*:
echo "hello 123 worLD" | grep -oP "\\b(?=[A-Za-z]*[a-z])(?=[A-Za-z]*[A-Z])[a-zA-Z]+"

查看在线演示

我还在开头添加了一个单词边界\b,以便先进行单词边界检查,然后再执行预查。


1
抱歉,我需要您提供需要翻译的具体文本内容。
echo "hello 123 worLD" | grep -oP "\b(?=[A-Z]+[a-z]|[a-z]+[A-Z])[a-zA-Z]*"

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

解释:

首先检查单词是否以一个或多个大写字母开头,后跟一个小写字母或反之,然后是任意数量的大小写字母,顺序不限。

性能:

此解决方案需要31步才能匹配提供的测试字符串,而接受的解决方案需要47步。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接