public ModDependency(string modRequirementString) { var match = Regex.Match(modRequirementString, @"^(?<isOptional>\? ?)?(?<isConflict>! ?)?(?<modName>[a-zA-Z0-9_-][a-zA-Z0-9_ -\.]+[a-zA-Z0-9_-])(?<notEqualVersion> *!= *[0-9\.]+)?(?<minVersion> *>=? *[0-9\.]+)?(?<maxVersion> *<=? *[0-9\.]+)?(?<exactVersion> *==? *[0-9\.]+)?$"); if (!match.Success) { throw new ArgumentException($"Invalid mod requirement string: '{modRequirementString}'", nameof(modRequirementString)); } isConflict = match.Groups["isConflict"].Success; isOptional = match.Groups["isOptional"].Success; modName = match.Groups["modName"].Value; if (match.Groups["minVersion"].Success) { if (!modRequirementString.Contains(">=")) { minVersion = new ModVersion(match.Groups["minVersion"].Value.Replace(">", "").Trim()); minVersion = ModVersion.increment(minVersion); } else { minVersion = new ModVersion(match.Groups["minVersion"].Value.Replace(">=", "").Trim()); } } if (match.Groups["maxVersion"].Success) { if (!modRequirementString.Contains("<=")) { maxVersion = new ModVersion(match.Groups["maxVersion"].Value.Replace("<", "").Trim()); maxVersion = ModVersion.decrement(maxVersion); } else { maxVersion = new ModVersion(match.Groups["maxVersion"].Value.Replace("<=", "").Trim()); } } if (match.Groups["exactVersion"].Success) { minVersion = maxVersion = new ModVersion(match.Groups["exactVersion"].Value.Replace("=", "").Trim()); } // @todo: it should allow versions lower than this, but it's not implemented yet if (match.Groups["notEqualVersion"].Success) { minVersion = new ModVersion(match.Groups["notEqualVersion"].Value.Replace("!=", "").Trim()); minVersion = ModVersion.increment(minVersion); } }