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的答案稍微简单/简短。我好久没在这里看到你了,砰,你过来为我们这些凡人点亮一盏灯!