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

9-4 可変長戻り読みでsplit

正規表現パズル

偶数個セミコロンが連続した直後の;#で文字列をsplitする。

対象文字列とsplit結果
"" → { "" }
";#" → { "", "" }
";;#" → { ";;#" }
";;;#" → { ";;", "" }
";;;;#" → { ";;;;#" }
"あ;#" → { "あ", "" }
";#あ" → { "", "あ" }
"あ;#い" → { "あ", "い" }
"あ;;#" → { "あ;;#" }
";;#あ" → { ";;#あ" }
"あ;;#い" → { "あ;;#い" }
"あ;;;#" → { "あ;;", "" }
";;;#あ" → { ";;", "あ" }
"あ;;;#い" → { "あ;;", "い" }
"ほげ;;#ほげ;#ふがふ;;;;#が;#ぴよ;;ぴよ" → { "ほげ;;#ほげ", "ふがふ;;;;#が", "ぴよ;;ぴよ" }


正規表現

(?<=(?<!;)(;;)*);#


解説

可変長の肯定戻り読みの中で、否定戻り読みを使ってます。

4-18 文字列データのカンマを検索(VBのエスケープ方式)


VB2005でのソースと実行結果

Module Module1
    Sub Main()
        helper("")
        helper(";#")
        helper(";;#")
        helper(";;;#")
        helper(";;;;#")
        helper("あ;#")
        helper(";#あ")
        helper("あ;#い")
        helper("あ;;#")
        helper(";;#あ")
        helper("あ;;#い")
        helper("あ;;;#")
        helper(";;;#あ")
        helper("あ;;;#い")
        helper("ほげ;;#ほげ;#ふがふ;;;;#が;#ぴよ;;ぴよ")

        Console.ReadLine()
    End Sub

    Private Sub helper(ByVal fromStr As String)
        Static No As Integer : No += 1
        Console.WriteLine("split対象" & CStr(No) & "は" & fromStr)

        Dim strArr As String() = Regex.Split(fromStr, "(?<=(?<!;)(;;)*);#", RegexOptions.ExplicitCapture)
        For i As Integer = 0 To strArr.GetUpperBound(0)
            Console.WriteLine(strArr(i).Replace(";;", ";"))
        Next i
    End Sub
End Module

実行結果
------------------------------------------------------------------------
split対象1は

split対象2は;#


split対象3は;;#
;#
split対象4は;;;#
;

split対象5は;;;;#
;;#
split対象6はあ;#
あ

split対象7は;#あ

あ
split対象8はあ;#い
あ
い
split対象9はあ;;#
あ;#
split対象10は;;#あ
;#あ
split対象11はあ;;#い
あ;#い
split対象12はあ;;;#
あ;

split対象13は;;;#あ
;
あ
split対象14はあ;;;#い
あ;
い
split対象15はほげ;;#ほげ;#ふがふ;;;;#が;#ぴよ;;ぴよ
ほげ;#ほげ
ふがふ;;#が
ぴよ;ぴよ