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

9-3 可変長戻り読みで連立不等式

正規表現パズル

行頭から見て2回目に出現した文字列STARTから文字列ENDまで検索する。

こちらを参考にさせていただきました


検索結果

START111END222START333END
              ^^^^^^^^^^^
START111START222END333
        ^^^^^^^^^^^
START111END222START333END444START555END
              ^^^^^^^^^^^
XXXXXXXXXX
no match


対象データ

START111END222START333END
START111START222END333
START111END222START333END444START555END
XXXXXXXXXX


正規表現

(?<=START.*)(?<!START.*START.*)START.*?END


解説

数学の連立不等式(同値命題)
Xは1以上の自然数である。かつ、Xは2以上の自然数でない。 ⇔ X=1
を使っています。

3-18 指定文字列がn回


VB2003でのソースと実行結果

Imports System.Text.RegularExpressions

Module Module1

    Sub Main()
        Dim array(3) As String
        array(0) = "START111END222START333END"
        array(1) = "START111START222END333"
        array(2) = "START111END222START333END444START555END"
        array(3) = "XXXXXXXXXX"

        Const matchPattern As String = "(?<=START.*)(?<!START.*START.*)START.*?END"

        Console.WriteLine("Pattern " & matchPattern)
        For i As Integer = 0 To array.GetUpperBound(0)
            Dim willOut As String = array(i)

            If Regex.IsMatch(array(i), matchPattern) Then
                Dim matchStr As String = Regex.Match(array(i), matchPattern).Value
                willOut &= " matchs " & matchStr
            Else
                willOut &= " no match"
            End If
            Console.WriteLine(willOut)
        Next i

        Console.ReadLine()
    End Sub
End Module

実行結果
----------------------------------------------------------
Pattern (?<=START.*)(?<!START.*START.*)START.*?END
START111END222START333END matchs START333END
START111START222END333 matchs START222END
START111END222START333END444START555END matchs START333END
XXXXXXXXXX no match