package Ġuk . co . sky em . random . string Matcher 1 Ċ Ċ import Ġkotlin . text . Regex Ċ Ċ internal Ġclass ĠStart End Matcher ( matches : ĠMatcher , Ġstarts : ĠBoolean , Ġends : ĠBoolean , Ġexclusive : ĠBoolean ) Ġ: ĠMatcher Ġ{ Ċ ĉ override Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ Ċĉ ĉ if Ġ( other Ġ!= Ġnull ) Ċĉĉ ĉ if Ġ( other Ġis ĠStart End Matcher ) Ċĉĉĉ ĉ if Ġ( other . matcher Ġ== Ġthis . matcher Ċĉĉĉĉĉ ĉ && Ġother . starts Ġ== Ġthis . starts Ċĉĉĉĉĉ ĉ && Ġother . ends Ġ== Ġthis . ends Ċĉĉĉĉĉ ĉ && Ġother . exclusive Ġ== Ġthis . exclusive ) Ċĉĉĉĉ ĉ return Ġtrue Ċĉ ĉ return Ġfalse Ċ ĉ } ĊĊ ĉ val Ġmatcher Ġ= Ġmatches Ċ ĉ val Ġstarts Ġ= Ġstarts Ċ ĉ val Ġends Ġ= Ġends Ċ ĉ val Ġexclusive Ġ= Ġexclusive ĊĊ ĉ override Ġfun Ġto Kotlin Regex (): ĠRegex Ġ{ Ċĉ ĉ if Ġ( matcher . can To Regex ()) Ġ{ Ċĉĉ ĉ if Ġ(! exclusive ) Ċĉĉĉ ĉ return ĠRegex (( if Ġ( ends ) Ġ" .* " Ġelse Ġ"") Ġ+ Ġmatcher . to Kotlin Regex (). pattern Ġ+ Ġ( if Ġ( starts ) Ġ" .* " Ġelse Ġ""), Ċĉĉĉĉĉ ĉ matcher . to Kotlin Regex (). options ) Ċĉĉ ĉ else Ġif Ġ( exclusive Ġ&& Ġends ) Ċĉĉĉ ĉ return ĠRegex (" .* (? =" Ġ+ Ġmatcher . to Kotlin Regex (). pattern Ġ+ Ġ") ") Ċĉ ĉ } Ċĉ ĉ throw ĠUnsupportedOperationException (" Cannot Ġconvert Ġmatcher Ġto Ġregex ") Ċ ĉ } ĊĊ ĉ override Ġfun Ġcan To Regex (): ĠBoolean Ġ{ Ċĉ ĉ return Ġmatcher . can To Regex () Ġ|| Ġ( exclusive Ġ&& Ġstarts ) Ċ ĉ } ĊĊ ĉ override Ġfun Ġuse On ( string : ĠString ): ĠMat ches Ġ{ Ċĉ ĉ // ĠThis Ġmight Ġbe Ġa Ġreally Ġbad Ġway Ġof Ġdoing Ġit , Ġbut ĠI 'm Ġst upid Ġso ĠI Ġdon 't Ġknow Ġa Ġbetter Ġway ... Ċĉ ĉ // Ġget Ġthe Ġmatches Ċĉ ĉ val Ġmatches Ġ= Ġmatcher . use On ( string ) Ċĉ ĉ if Ġ( starts Ġ&& Ġends ) Ġ{ Ġ// Ġthis Ġessentially Ġmeans Ġmatch Ġeverything Ġif Ġsomething Ġis Ġfound Ċĉĉ ĉ // Ġmatch Ġthe Ġwhole Ġthing ĠIF Ġsomething Ġis Ġfound . Ċĉĉ ĉ if Ġ( matches . match Found ()) Ġ{ Ċĉĉĉ ĉ if Ġ(! exclusive ) Ġ// Ġreturn Ġthe Ġwhole Ġstring Ċĉĉĉĉ ĉ return ĠMat ches ( array Of ( Match ( string , Ġ 0 , Ġstring . length ()))) Ċĉĉĉ ĉ else Ġ// Ġreturn Ġthe Ġwhole Ġstring , Ġexcluding Ġthe Ġthings Ġthat Ġwere Ġmatched , Ġbasically , Ġa Ġmatch (). invert Ċĉĉĉĉ ĉ return Ġmatcher . invert (). use On ( string ) Ċĉĉ ĉ } Ġelse Ġreturn ĠMat ches () Ċĉ ĉ } Ġelse Ġif Ġ(! starts Ġ&& Ġ! ends ) Ġ{ Ġ// Ġthis Ġis Ġessentially Ġjust Ġpassing Ġthe Ġmatches Ġthrough Ċĉĉ ĉ if Ġ(! exclusive ) Ċĉĉĉ ĉ return Ġmatches Ċĉĉ ĉ else Ċĉĉĉ ĉ return ĠMat ches (); Ġ// Ġin Ġthis Ġcase , Ġit Ġreturns Ġnothing Ċĉ ĉ } Ġelse Ġif Ġ( starts ) Ġ{ Ġ// Ġif Ġit Ġstarts Ġwith Ġsomething Ġmatch Ġthe Ġrest Ċĉĉ ĉ // Ġso ... Ġwe Ġstart Ġfrom Ġthe Ġfirst Ġmatch Ġgoing Ġleft Ġto Ġright Ġand Ġtake Ġthe Ġposition Ġof Ġthe Ġmatch Ċĉĉ ĉ val Ġstart Ġ= Ġmatches . first (). start Ċĉĉ ĉ if Ġ( exclusive ) Ġ{ Ċĉĉĉ ĉ val Ġend Ġ= Ġmatches . first (). end Ċĉĉĉ ĉ return ĠMat ches ( array Of ( Match ( string . substring ( end ), Ġend , Ġstring . length ()))) Ċĉĉ ĉ } Ġelse ĠĠĠ Ġ// Ġand Ġmake Ġa Ġsubstring Ġstarting Ġfrom Ġthat Ġuntil Ġthe Ġend Ġthen Ġmake Ġa Ġmatch Ġwith Ġit Ġand Ġreturn Ġit Ċĉĉĉ ĉ return ĠMat ches ( array Of ( Match ( string . substring ( start ), Ġstart , Ġstring . length ()))) Ċĉ ĉ } Ġelse Ġ/* if Ġ( ends ) */ Ġ{ Ċĉĉ ĉ // Ġso ... Ġwe Ġstart Ġfrom Ġthe Ġfirst Ġmatch Ġgoing Ġright Ġto Ġleft Ġ( last Ġmatch ) Ġand Ġtake Ġit 's Ġposition Ċĉĉ ĉ val Ġend Ġ= Ġmatches . last (). end Ċĉĉ ĉ if Ġ( exclusive ) Ġ{ Ċĉĉĉ ĉ val Ġstart Ġ= Ġmatches . last (). start Ċĉĉĉ ĉ return ĠMat ches ( array Of ( Match ( string . substring ( 0 , Ġstart ), Ġ 0 , Ġstart ))) Ċĉĉ ĉ } Ġelse Ġ// Ġand Ġmake Ġa Ġsubstring Ġstarting Ġfrom Ġthe Ġstart Ġof Ġstring Ġuntil Ġthat Ġthen Ġmake Ġa Ġmatch Ġwith Ġit Ġand Ġreturn Ġit Ċĉĉĉ ĉ return ĠMat ches ( array Of ( Match ( string . substring ( 0 , Ġend ), Ġ 0 , Ġend ))) Ċĉ ĉ } Ċ ĉ } Ċ Ċ } Ċ