我希望在正则表达式的反向引用中匹配大写字符的小写版本。例如,假设我想匹配一个字符串,其中第一个字符是任何大写字符,第四个字符是与第一个字符相同的字母,除了它是一个小写字符。如果我将grep
与此正则表达式一起使用:
grep -E "([A-Z])[a-z]{2}\1[a-z]"
例如,它会与"EssEx"
和"SusSe"
匹配。我想要匹配"Essex"
和"Susse"
。是否可以修改上述正则表达式来实现这一目标?
答案 0 :(得分:2)
这将更加冗长,但awk完成了这项任务:
awk '/([A-Z])[a-z]{2}/ && tolower(substr($1, 1, 1)) == substr($1, 4, 1) &&
substr($1, 5) ~ /[a-z]/' file
Essex
Susse
答案 1 :(得分:2)
这是内联修饰符派上用场的一种情况。这是一个使用区分大小的前瞻来检查的解决方案,它不是完全相同(大写)字符和不区分大小写的反向引用来匹配拟合的小写字母:
([A-Z])[a-z]{2}(?-i)(?!\1)(?i)\1[a-z]
请注意,(?-i)最不可能是不需要的,但为了清楚起见,它是在那里。所有正则表达式都不支持内联修饰符。 PCRE支持它,因此您必须使用-P
和grep。