2017-08-23 44 views
1

我需要在Unix中使用grep編寫正則表達式,該行發現雙字符出現奇數次的行。奇數行中的雙字符(GREP)

例如:

unix AA unixAA unix helpme AA //**true**, because 'AA' occurs 3 times 

??red blue pink yellow red pink //**true**, because '??' occurs once 

unixA unixAA unix unixAA unix //**false**, because 'AA' occurs 2 times 

??red blue?? pink?? yellow?? //**false**, because '??' occurs 4 times 

感謝您的幫助:)

+1

什麼我f有'AAA'?這算作1或2還是沒有? –

+0

說實話,我不知道。但我認爲它沒有任何意義。如果有'AAAA'會怎麼樣?在這個任務中,我需要找到雙重字符,而不是三重,四重等。 – AsiaRafi

+0

最後一行包含'黃色'奇數次的'll'。它也「逆向」成爲「真」 – RomanPerekhrest

回答

3

這是相當複雜的正則表達式的問題。您將需要GNU grep命令能夠使用 向前看符號來解決這個複雜的正則表達式:

^(?:(?!(.)\1).)*((.)\3)((?:(?:(?!\2).)*\2){2})*(?:(?!\2).)*$ 

grep使用:

grep -P '^(?:(?!(.)\1).)*((.)\3)((?:(?:(?!\2).)*\2){2})*(?:(?!\2).)*$' file 

unix AA unixAA unix helpme AA 
??red blue pink yellow red pink 

RegEx Demo

正則表達式破碎:

^       # Start 
(?:(?!(.)\1).)*   # Match 0+ characters that don't repeat at start 
((.)\3)     # Match 2 repeats of same character and capture in group #2 
((?:(?:(?!\2).)*\2){2})* # match 0+ occurrence of some text followed by group #2 
(?:(?!\2).)*    # match anything in the end that doesn't have group #2 
$       # End 
+0

證明了一點,你應該編碼一個簡單的解析器,而不是產生不可讀的正則表達式mishmash :-) – paxdiablo

+0

同意。如果我必須解決這個問題,我會考慮3次使用正則表達式之前。我剛剛發佈了這個,因爲問題是關於'regex'和'grep'。 – anubhava

+1

這是我4年來第一次在StackOverflow上進行投票和反對投票,這兩個投票都是相同的答案:-)最多可以寫下來,因爲它的模糊性! –