如何匹配反向引用的小写版本

时间:2017-01-31 18:25:37

标签: regex grep

我希望在正则表达式的反向引用中匹配大写字符的小写版本。例如,假设我想匹配一个字符串,其中第一个字符是任何大写字符,第四个字符是与第一个字符相同的字母,除了它是一个小写字符。如果我将grep与此正则表达式一起使用:

grep -E "([A-Z])[a-z]{2}\1[a-z]"

例如,它会与"EssEx""SusSe"匹配。我想要匹配"Essex""Susse"。是否可以修改上述正则表达式来实现这一目标?

2 个答案:

答案 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。