2017-08-03 5 views
1

正確に同じ数の文字AとBをパターンに一致させて、正確にn個のAの後に正確にn個のBが付くようにしたいとします。 たとえば、次の文字列を一致させることができます。egrep内の同じ数のBsで一致する

  1. AB
  2. AABB
  3. AAABBB

一方、これらの文字列を一致させることができない

  1. BA
  2. AAABB
  3. AABBB
  4. 問題にアプローチする
  5. ABAB

、私は私の試みはもちろんのこの

egrep 'A{n}B{n}' 

のように見えるので、ただし、繰り返し回数nは中括弧内はすることはできません、繰り返し回数考えています暗黙的に定義される。

私はそれに合わせてプログラムを書く方法を知っていますが、私はこれをMac端末でテストしています。したがって、egrepの可能な機能を利用して1つの文パターンを書くことを試みています。

誰も私がこの問題を解決するのを助けてください、そして、どんな助けも高く評価されるでしょう。

+0

これはかなりの重複である(https://stackoverflow.com/q/3644266/7586)[どのように我々は、Javaの正規表現で^ n個のB^nと一致することができますか?]。より広範な答えは、正規表現は通常、物事を数えるのに問題があるということです。 – Kobi

+0

確かに、この問題の難しい部分は、egrepを使ってUnix上で実行しなければならないということです。 – Peter

+0

'egrep'だけでは解決できません。あなたは少なくとも 'gnu grep'が必要です。 (私の答えは以下を参照) – anubhava

答えて

0

あなたはgnu grepを持っているなら、あなたは、この再帰的なPCRE正規表現を使用することができます

awk '(n=index($0, "B")) && length(substr($0, 1, n-1)) == length(substr($0, n))' file 

AB 
AABB 
AAABBB 

のこのawk検索有無:他

grep -P '^(A(?1)?B)$' file 

AB 
AABB 
AAABBB 

かを、あなたはawkを使用して、この非正規表現のアプローチを使用することができます最初にBを使用して、index関数を使用し、2つの部分文字列、つまりすべてAsとすべてBsを抽出し、長さが0の場合は各レコードを出力します部分文字列の長さはBs部分文字列と同じです。

0

2つの代替GNU AWKアプローチ:

からmatch機能を使用して: -

awk -v FPAT="A|B" '{ for(i=1;i<=NF;i++) { ($i=="A" && $(i-1)!="B")? a++:b++ } }a==b' file 

フィールド値を定義するために出力をFPAT変数を使用して

awk '{ match($0,/^(A+)(B+)$/,a) }length(a) && length(a[1])==length(a[2])' file 

を(両方のappr oaches):

AB 
AABB 
AAABBB 
関連する問題