トップページに戻る    次の正規表現パズルへ    前の正規表現パズルへ

9-1 可変長戻り読み

正規表現パズル

置換を使って、
行ごとに
行頭から数えた出現回数が、
2回目以降の文字を削除する。

置換前


置換後


6-2 出現回数が2回目以降なら削除その1のアレンジ問題です。


対象データ

AAABBCCDDE
ABCDDEE
AABBCCDD
ABBBCCAAD
XXXXXXXXXX
YYYAAAYYY
ZZZZZ


正規表現

(.)(?<=\1.*\1)
を削除


解説

.NETの正規表現では、可変長の戻り読みが使えるので使用してます。

JavaとC#とVB.NETとOracleとRubyでの正規表現の使用例


VB2003でのソースと実行結果

Imports System.Text.RegularExpressions

Module Module1

    Sub Main()
        Dim array(6) As String
        array(0) = "AAABBCCDDE"
        array(1) = "ABCDDEE"
        array(2) = "AABBCCDD"
        array(3) = "ABBBCCAAD"
        array(4) = "XXXXXXXXXX"
        array(5) = "YYYAAAYYY"
        array(6) = "ZZZZZ"

        For i As Integer = 0 To array.GetUpperBound(0)
            Console.WriteLine("----------------------")
            Console.WriteLine("置換前" & array(i))
            array(i) = Regex.Replace(array(i), "(.)(?<=\1.*\1)", "")
            Console.WriteLine("置換後" & array(i))
        Next i

        Console.ReadLine()
    End Sub
End Module


----------------------
置換前AAABBCCDDE
置換後ABCDE
----------------------
置換前ABCDDEE
置換後ABCDE
----------------------
置換前AABBCCDD
置換後ABCD
----------------------
置換前ABBBCCAAD
置換後ABCD
----------------------
置換前XXXXXXXXXX
置換後X
----------------------
置換前YYYAAAYYY
置換後YA
----------------------
置換前ZZZZZ
置換後Z