diff --git a/Content.Tests/DMProject/Tests/Regex/regex_l_test.dm b/Content.Tests/DMProject/Tests/Regex/regex_l_test.dm new file mode 100644 index 0000000000..f637e6040e --- /dev/null +++ b/Content.Tests/DMProject/Tests/Regex/regex_l_test.dm @@ -0,0 +1,5 @@ + +/proc/RunTest() + var/regex/R = regex(@"\l") + var/meep = R.Find("0abc123def") + ASSERT(meep == 2) diff --git a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs index ec9dd6cc94..8fd306816d 100644 --- a/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs +++ b/OpenDreamRuntime/Objects/MetaObjects/DreamMetaObjectRegex.cs @@ -31,6 +31,19 @@ public void OnObjectCreated(DreamObject dreamObject, DreamProcArguments creation if (flagsString.Contains("g")) regex.IsGlobal = true; } + // TODO Make this more Robust(TM) + var anyLetterIdx = patternString.IndexOf("\\l"); // From the ref: \l = Any letter A through Z, case-insensitive + while (anyLetterIdx >= 0) { + if (anyLetterIdx == 0 || patternString[anyLetterIdx - 1] != '\\') { // TODO Need to make this handle an arbitrary number of escape chars + patternString = patternString.Remove(anyLetterIdx, 2).Insert(anyLetterIdx, "[A-Za-z]"); + } + + var nextIdx = anyLetterIdx + 1; + if(nextIdx >= patternString.Length) break; + + anyLetterIdx = patternString.IndexOf("\\l", nextIdx); + } + regex.Regex = new Regex(patternString, options); } else { throw new System.Exception("Invalid regex pattern " + pattern);