2017-01-31 29 views
3

我想在正則表達式中反向引用中匹配大寫字符的小寫版本。例如,假設我想匹配一個字符串,其中第一個字符是任何大寫字符,而第四個字符與第一個字母是相同的字母,除了它是小寫字符。如果我使用grep這個正則表達式:如何匹配反向引用的小寫版本

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

它將匹配例如"EssEx""SusSe"。我想匹配"Essex""Susse"。是否可以修改上述正則表達式來實現這一點?

+0

好吧,試試''[A-Z] [a-z] {4}「' –

+1

這也可以匹配」Esssx「。我只希望它匹配,如果它是反向引用中的同一個字母的小寫版本。例如''a''''''''''Q'''''。沒有任何其他小寫字符。 –

+3

是否支持內聯修飾符?如果是的話,好的舊的([A-Z])[a-z] {2}(?-i)(?!\ 1)(?i)\ 1 [a-z] *'應該可以工作。 –

回答

2

這是哪裏內嵌修飾符派上用場的案例之一。下面是利用的情況下,靈敏前瞻來測試解決方案,這是不完全一樣(大寫)字符和不區分大小寫的反向引用匹配配件小寫字母:

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

注意, (?-i)最有可能不需要,但它是爲了清晰起見。內嵌修飾符不受所有正則表達式風格的支持。 PCRE支持它,所以你將不得不使用grep的-P

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 
+2

我很久沒在這裏見過你了,巴姆,你一起來爲我們這些凡人發光吧! – Martin

+1

按預期工作! –