-
Notifications
You must be signed in to change notification settings - Fork 74
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: Improve handling of complex regexes like email, password or uri
Patterns used to validate email, password and uri can be quite complex. The current generators are struggling to generate valid values expecially when a fixed, large length is required. In this cases specific code is introduced in this commit to handle these 3 particular cases
- Loading branch information
Showing
9 changed files
with
304 additions
and
33 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
45 changes: 45 additions & 0 deletions
45
src/main/java/com/endava/cats/generator/simple/RegexFlattener.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
package com.endava.cats.generator.simple; | ||
|
||
/** | ||
* Flattens a regex by simplifying character classes, quantifiers, and removing unnecessary parentheses. | ||
*/ | ||
public abstract class RegexFlattener { | ||
|
||
|
||
/** | ||
* Flattens a regex by simplifying character classes, quantifiers, and removing unnecessary parentheses. | ||
* | ||
* @param regex the regex to flatten | ||
* @return the flattened regex | ||
*/ | ||
public static String flattenRegex(String regex) { | ||
regex = simplifyCharacterClasses(regex); | ||
regex = simplifyQuantifiers(regex); | ||
// regex = useNonCapturingGroups(regex); | ||
|
||
return regex; | ||
} | ||
|
||
public static String useNonCapturingGroups(String regex) { | ||
return regex.replaceAll("\\((?!\\?:)(?=[^()]*\\|)", "(?:"); | ||
} | ||
|
||
private static String simplifyCharacterClasses(String regex) { | ||
regex = regex.replaceAll("\\[a-zA-Z0-9_\\]", "\\\\w"); | ||
regex = regex.replaceAll("\\[0-9\\]", "\\\\d"); | ||
regex = regex.replaceAll("\\[\\s\\t\\r\\n\\f\\]", "\\\\s"); | ||
|
||
regex = regex.replaceAll("\\[^\\\\d\\]", "\\\\D"); | ||
regex = regex.replaceAll("\\[^\\\\w\\]", "\\\\W"); | ||
regex = regex.replaceAll("\\[^\\\\s\\]", "\\\\S"); | ||
|
||
return regex; | ||
} | ||
|
||
private static String simplifyQuantifiers(String regex) { | ||
regex = regex.replaceAll("\\{0,1\\}", "?"); | ||
regex = regex.replaceAll("\\{1,\\}", "+"); | ||
regex = regex.replaceAll("\\{0,\\}", "*"); | ||
return regex; | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.