我正在尝试提取单词 [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
不应该匹配。
最佳答案
.*
在先行检查中,不仅在相邻单词中,而且在字符串中检查字母是否存在。使用 [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
在开头,以便仅在单词边界之后执行先行检查。
关于regex - 匹配至少一个小写字母和至少一个大写字母,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38897840/