![]() |
Chilkat HOME Android™ AutoIt C C# C++ Chilkat2-Python CkPython Classic ASP DataFlex Delphi DLL Go Java Node.js Objective-C PHP Extension Perl PowerBuilder PowerShell PureBasic Ruby SQL Server Swift Tcl Unicode C Unicode C++ VB.NET VBScript Visual Basic 6.0 Visual FoxPro Xojo Plugin
(Visual FoxPro) Regular Expression Catastrophic BacktrackSee more Regular Expressions ExamplesThis example demonstrates how adding a processing time limit prevents a catastrophic backtrack.Catastrophic backtracking in regular expressions occurs when a poorly constructed pattern causes the regex engine to try an exponential number of possibilities, especially on non-matching input. This leads to extremely slow performance or even a program hang. Example:(a+)+$ Applied to: aaaaaaaaaaaaaaaaaaaaaab The regex engine tries many combinations of grouping How to prevent it:
Catastrophic backtracking is especially dangerous when regex patterns are applied to user-controlled input. Note: This example requires Chilkat v11.1.0 or greater.
LOCAL loSbSubject LOCAL i LOCAL lcPattern LOCAL loJson LOCAL lnNumMatches loSbSubject = CreateObject('Chilkat.StringBuilder') * Create data that would cause a catastrophic backtrack with the regular expression "((a+)+$)" i = 0 DO WHILE i < 500 loSbSubject.Append("aaaaaaaaaaaaaaaaaaaa") i = i + 1 ENDDO loSbSubject.Append("X") lcPattern = "((a+)+$)" loJson = CreateObject('Chilkat.JsonObject') loJson.EmitCompact = 0 * Set a time limit to prevent a catastrophic backtrack.. * (Approx) 1 second time limit. * This should fail: lnNumMatches = loSbSubject.RegexMatch(lcPattern,loJson,1000) IF (lnNumMatches < 1) THEN ? loSbSubject.LastErrorText * We should get an error such as the following: * ChilkatLog: * RegexMatch: * ChilkatVersion: 11.1.0 * regex_match: * timeoutMs: 1000 * Exceeded regular expression match limit. * elapsedMs: Elapsed time: 797 millisec * num_matches: -1 * --regex_match * --RegexMatch * --ChilkatLog RELEASE loSbSubject RELEASE loJson CANCEL ENDIF * We shouldn't get here. * The above data and regular expression should've caused a catastrophic backtrack. ? "numMatches: " + STR(lnNumMatches) ? loJson.Emit() RELEASE loSbSubject RELEASE loJson |
© 2000-2025 Chilkat Software, Inc. All Rights Reserved.