トップページに戻る
次の正規表現パズルへ
前の正規表現パズルへ
9-4 可変長戻り読みでsplit
正規表現パズル
偶数個セミコロンが連続した直後の;#で文字列をsplitする。
対象文字列とsplit結果
"" → { "" }
";#" → { "", "" }
";;#" → { ";;#" }
";;;#" → { ";;", "" }
";;;;#" → { ";;;;#" }
"あ;#" → { "あ", "" }
";#あ" → { "", "あ" }
"あ;#い" → { "あ", "い" }
"あ;;#" → { "あ;;#" }
";;#あ" → { ";;#あ" }
"あ;;#い" → { "あ;;#い" }
"あ;;;#" → { "あ;;", "" }
";;;#あ" → { ";;", "あ" }
"あ;;;#い" → { "あ;;", "い" }
"ほげ;;#ほげ;#ふがふ;;;;#が;#ぴよ;;ぴよ" → { "ほげ;;#ほげ", "ふがふ;;;;#が", "ぴよ;;ぴよ" }
正規表現
(?<=(?<!;)(;;)*);#
解説
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はほげ;;#ほげ;#ふがふ;;;;#が;#ぴよ;;ぴよ
ほげ;#ほげ
ふがふ;;#が
ぴよ;ぴよ