2017-08-23 20 views
1

grepを使用して正規表現を書く必要があります。これは、二重文字が奇数回現れる行を見つけます。例えば2桁の奇数(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'があればどうしますか?この作業では、3倍、4倍などではなく、2倍の文字を見つける必要があります。 – AsiaRafi

+0

最後の行に '黄色い'奇数回の 'll'が含まれています。それはまた「真実」であることを「逆転する」 – RomanPerekhrest

答えて

3

これはかなり複雑な正規表現の問題です。

grepに使用
^(?:(?!(.)\1).)*((.)\3)((?:(?:(?!\2).)*\2){2})*(?:(?!\2).)*$ 

:あなたは、この複雑な正規表現を解決するために 先読みを使用できるように、GNU 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

合意。私がこの問題を解決しなければならない場合、私はregexを使う前に3回考えるでしょう。質問は 'regex'と' grep'に関するものだったので、これを投稿しました。 – anubhava

+1

これはStackOverflowで4年ぶりのことで、同じ回答を投票してダウン投票したかったのです:-)それは、判読不能のためにそれを書く能力のためです。 –

関連する問題