74460


正規表現で二つの文字の繰り返しをマッチングさせたい  
これは文章の境界線として使われているパターンです。

たとえば、

[code]

    こたこたこたこたこたこたこたこたこたこたこた
    
    なぬなぬなぬなぬなぬなぬなぬなぬなぬなぬなぬなぬなぬなぬなぬ
    
[/code]

このような区切りとして使っている場合に無意味にひらがなや記号が交互に並びます。

同じひらがなが

[code]

    なななななななななななななななななななななな
    
[/code]

このようであれば簡単ですが、文字は決まっていないので厄介です。

これら二つの文字が交互に繰り返されているときにマッチングさせる正規表現はどのように書きますでしょうか？

よろしくお願いいたします。


CC BY-SA 4.0
2021-03-06T12:34:50.397
74459
2021-03-06T16:21:41.527
2021-03-06T14:53:13.410
7290
43999
question
正規表現
正規表現で二つの文字の繰り返しをマッチングさせたい


書き方は正規表現エンジンによりますが、キャプチャしたグループの[後方参照](https://qiita.com/ikmiyabi/items/12d1127056cdf4f0eea5#%E3%82%AD%E3%83%A3%E3%83%97%E3%83%81%E3%83%A3)で実現できます。

  * `(..)\1+` ひらがなや記号など任意の2文字の繰り返し(改行やスペースも含む)
  * `(\w{2})\1+` ひらがなやアルファベット、数字2文字の繰り返し


CC BY-SA 4.0
2021-03-06T13:19:15.560
74460
2021-03-06T13:19:15.560
9820
74459
answer


> 異なる文字という意味になります。こたこたこたこたみたいな感じです。

Negative lookahead(否定先読み) `(?! ... )` を使います。この場合、同じ文字の繰り返しにはマッチしません。

[code]

    $ echo 'こたこたこたこたこた' | grep -Po '((.)(?!\2).)\1+'
    こたこたこたこたこた
    $ echo 'なぬなぬなぬなぬなぬ' | grep -Po '((.)(?!\2).)\1+'
    なぬなぬなぬなぬなぬ
    
    # No match
    $ echo 'なななななななななな' | grep -Po '((.)(?!\2).)\1+'
    
[/code]

質問内容に既視感があったので調べてみると、

[５桁以内の半角数字でかつ「0だけ」は許可しない正規表現](https://ja.stackoverflow.com/questions/49704/)

がありました。参考になるかもしれません。


CC BY-SA 4.0
2021-03-06T15:35:45.813
74463
2021-03-06T16:21:41.527
2021-03-06T16:21:41.527
74459
answer