From 6557e5930b178f491abec516e5d6078b15c3c77e Mon Sep 17 00:00:00 2001 From: amylizzle Date: Fri, 22 Dec 2023 18:17:47 +0000 Subject: [PATCH] fix next getting set on replcae --- Content.Tests/DMProject/Tests/Regex/regex_defer.dm | 3 ++- OpenDreamRuntime/Procs/Native/DreamProcNativeRegex.cs | 10 +++++++++- 2 files changed, 11 insertions(+), 2 deletions(-) diff --git a/Content.Tests/DMProject/Tests/Regex/regex_defer.dm b/Content.Tests/DMProject/Tests/Regex/regex_defer.dm index 19d187e866..b2ca5ed24c 100644 --- a/Content.Tests/DMProject/Tests/Regex/regex_defer.dm +++ b/Content.Tests/DMProject/Tests/Regex/regex_defer.dm @@ -9,4 +9,5 @@ /proc/RunTest() var/regex/R = regex(@"\w+") var/result = R.Replace("Hello, there", /proc/regex_callback) - ASSERT(result == "good, there") \ No newline at end of file + ASSERT(result == "good, there") + ASSERT(R.next == 5) \ No newline at end of file diff --git a/OpenDreamRuntime/Procs/Native/DreamProcNativeRegex.cs b/OpenDreamRuntime/Procs/Native/DreamProcNativeRegex.cs index 83f5440512..9e3b56062d 100644 --- a/OpenDreamRuntime/Procs/Native/DreamProcNativeRegex.cs +++ b/OpenDreamRuntime/Procs/Native/DreamProcNativeRegex.cs @@ -96,8 +96,10 @@ async Task DoProcReplace(AsyncNativeProc.State state, DreamProc proc currentHaystack = regex.Regex.Replace(currentHaystack, replacement, 1, currentStart); currentStart = match.Index + Math.Max(replacement.Length, 1); - if (!regex.IsGlobal) + if (!regex.IsGlobal){ + regex.SetVariable("next", new DreamValue(currentStart + 1)); break; + } } var replaced = currentHaystack; @@ -108,6 +110,12 @@ async Task DoProcReplace(AsyncNativeProc.State state, DreamProc proc } DreamValue DoTextReplace(string replacement) { + if(!regex.IsGlobal) { + var match = regex.Regex.Match(haystackString, Math.Clamp(start - 1, 0, haystackSubstring.Length)); + if (!match.Success) return new DreamValue(haystackString); + regexInstance.SetVariable("next", new DreamValue(match.Index + Math.Max(replacement.Length, 1))); + } + string replaced = regex.Regex.Replace(haystackSubstring, replacement, regex.IsGlobal ? -1 : 1, Math.Clamp(start - 1, 0, haystackSubstring.Length));