Regex 如何匹配backreference的小写版本

Regex 如何匹配backreference的小写版本,regex,grep,Regex,Grep,我想在正则表达式的反向引用中匹配大写字符的小写版本。例如,假设我想匹配一个字符串,其中第一个字符是任何大写字符,第四个字符与第一个字符相同,只是它是小写字符。如果我将grep与此正则表达式一起使用: grep -E "([A-Z])[a-z]{2}\1[a-z]" 例如,它将匹配“EssEx”和“SusSe”。我想将“Essex”与“Susse”匹配。是否可以修改上述正则表达式以实现此目的?它将更加详细,但这可以完成以下任务: awk '/([A-Z])[a-z]{2}/ &&

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

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

例如,它将匹配
“EssEx”
“SusSe”
。我想将
“Essex”
“Susse”
匹配。是否可以修改上述正则表达式以实现此目的?

它将更加详细,但这可以完成以下任务:

awk '/([A-Z])[a-z]{2}/ && tolower(substr($1, 1, 1)) == substr($1, 4, 1) && 
     substr($1, 5) ~ /[a-z]/' file

Essex
Susse

这是内联修饰符派上用场的情况之一。下面是一个解决方案,它使用区分大小写的先行检查来检查它是否完全相同(大写)字符,并使用不区分大小写的反向引用来匹配合适的小写字母:

([A-Z])[a-z]{2}(?-i)(?!\1)(?i)\1[a-z]

注意(?-i)很可能是不需要的,但是为了清楚起见,它在那里。并非所有正则表达式风格都支持内联修饰符。PCRE支持它,因此您必须将
-P
与grep一起使用。

那么,请尝试
“[A-Z][A-Z]{4}”
,例如,它也将匹配“Esssx”。我只希望它匹配,如果它是一个小写版本的同一个字母,在反向引用。例如
a
用于
a
q
用于
q
。不支持任何其他小写字符。是否支持内联修饰符?如果是,好的旧
([A-Z])[A-Z]{2}(?-i)(?!\1)(?i)\1[A-Z]*
应该可以工作。@SebastianProske如果我使用
grep-P
的话,效果和预期的一样,这很好。如果你用这个来发布答案,我会接受的,因为它使用了grep,比@anubhava的答案稍微简单/简短。我好久没在这里看到你了,砰,你过来为我们这些凡人点亮一盏灯!