From 35e9c6d73a417815fe6bf5ab5b46f34be95d7fde Mon Sep 17 00:00:00 2001 From: Greg Gibeling Date: Mon, 16 Mar 2026 11:13:37 -0700 Subject: [PATCH] Use a possessive quantifier when parsing copyright holder to avoid exponential backtracking --- .../contract/model/contract/license/ALicenseParser.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/re-contract/src/main/java/com/g2forge/reassert/contract/model/contract/license/ALicenseParser.java b/re-contract/src/main/java/com/g2forge/reassert/contract/model/contract/license/ALicenseParser.java index 781d8d7..d974dc1 100644 --- a/re-contract/src/main/java/com/g2forge/reassert/contract/model/contract/license/ALicenseParser.java +++ b/re-contract/src/main/java/com/g2forge/reassert/contract/model/contract/license/ALicenseParser.java @@ -10,6 +10,7 @@ import com.g2forge.alexandria.parse.IMatcher; import com.g2forge.alexandria.parse.IMatcherBuilder; import com.g2forge.alexandria.parse.NamedCharacterClass; +import com.g2forge.alexandria.parse.QuanitifierVariant; import com.g2forge.alexandria.parse.regex.Regex; import com.g2forge.alexandria.parse.regex.RegexMatcher; import com.g2forge.reassert.core.api.ReassertLegalOpinion; @@ -29,7 +30,7 @@ public static abstract class APatternListBuilder implements IBuilder parenthetical = pattern().group(g -> g.with(gap).text("(").charClass(true, cc -> cc.character(')')).plus().text(")")).opt().build(); - protected static final IMatcher holder = pattern().group(g0 -> g0.group(g1 -> g1.with(gap).charClass(false, cc -> cc.range('a', 'z').range('A', 'Z').range('0', '9')).plus()).plus()).opt().build(); + protected static final IMatcher holder = pattern().group(g0 -> g0.group(g1 -> g1.charClass(false, cc -> cc.character('-').character('_').named(NamedCharacterClass.Space)).star().charClass(false, cc -> cc.range('a', 'z').range('A', 'Z').range('0', '9')).plus(QuanitifierVariant.POSSESSIVE)).plus()).opt().build(); protected static final IMatcher the = pattern().group(g -> g.text("the").with(gap)).opt().build();