diff options
Diffstat (limited to 'src/net/sourceforge/plantuml/command/regex/RegexLeaf.java')
-rw-r--r-- | src/net/sourceforge/plantuml/command/regex/RegexLeaf.java | 104 |
1 files changed, 99 insertions, 5 deletions
diff --git a/src/net/sourceforge/plantuml/command/regex/RegexLeaf.java b/src/net/sourceforge/plantuml/command/regex/RegexLeaf.java index f09f38a..70ce436 100644 --- a/src/net/sourceforge/plantuml/command/regex/RegexLeaf.java +++ b/src/net/sourceforge/plantuml/command/regex/RegexLeaf.java @@ -2,7 +2,7 @@ * PlantUML : a free UML diagram generator * ======================================================================== * - * (C) Copyright 2009-2017, Arnaud Roques + * (C) Copyright 2009-2020, Arnaud Roques * * Project Info: http://plantuml.com * @@ -36,13 +36,20 @@ package net.sourceforge.plantuml.command.regex; import java.util.Collections; +import java.util.HashSet; import java.util.Iterator; import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; import java.util.regex.Pattern; +import net.sourceforge.plantuml.StringLocated; + public class RegexLeaf implements IRegex { - private final Pattern2 pattern; + private static final RegexLeaf END = new RegexLeaf("$"); + private static final RegexLeaf START = new RegexLeaf("^"); + private final String pattern; private final String name; private int count = -1; @@ -51,8 +58,24 @@ public class RegexLeaf implements IRegex { this(null, regex); } + public static RegexLeaf spaceZeroOrMore() { + return new RegexLeaf("[%s]*"); + } + + public static RegexLeaf spaceOneOrMore() { + return new RegexLeaf("[%s]+"); + } + + public static RegexLeaf start() { + return START; + } + + public static RegexLeaf end() { + return END; + } + public RegexLeaf(String name, String regex) { - this.pattern = MyPattern.cmpile(regex, Pattern.CASE_INSENSITIVE); + this.pattern = regex; this.name = name; } @@ -66,12 +89,12 @@ public class RegexLeaf implements IRegex { } public String getPattern() { - return pattern.pattern(); + return pattern; } public int count() { if (count == -1) { - count = pattern.matcher("").groupCount(); + count = MyPattern.cmpile(pattern, Pattern.CASE_INSENSITIVE).matcher("").groupCount(); } return count; } @@ -88,4 +111,75 @@ public class RegexLeaf implements IRegex { return Collections.singletonMap(name, m); } + public boolean match(StringLocated full) { + throw new UnsupportedOperationException(); + } + + public RegexResult matcher(String full) { + throw new UnsupportedOperationException(); + } + + static private final Set<String> UNKNOWN = new HashSet<String>(); + + static private final Pattern p1 = Pattern.compile("^[-0A-Za-z_!:@;/=,\"]+$"); + static private final Pattern p2 = Pattern.compile("^[-0A-Za-z_!:@;/=,\"]+\\?$"); + static private final Pattern p3 = Pattern + .compile("^\\(?[-0A-Za-z_!:@;/=\" ]+\\??(\\|[-0A-Za-z_!:@;/=,\" ]+\\??)+\\)?$"); + + private static long getSignatureP3(String s) { + long result = -1L; + for (StringTokenizer st = new StringTokenizer(s, "()|"); st.hasMoreTokens();) { + final String val = st.nextToken(); + final long sig = FoxSignature.getFoxSignature(val.endsWith("?") ? val.substring(0, val.length() - 2) : val); + result = result & sig; + } + return result; + } + + public long getFoxSignatureNone() { + return 0; + } + + public long getFoxSignature() { + if (p1.matcher(pattern).matches()) { + return FoxSignature.getFoxSignature(pattern); + } + if (p2.matcher(pattern).matches()) { + return FoxSignature.getFoxSignature(pattern.substring(0, pattern.length() - 2)); + } + if (p3.matcher(pattern).matches()) { + // System.err.println("special " + pattern); + // System.err.println("result " + FoxSignature.backToString(getSignatureP3(pattern))); + return getSignatureP3(pattern); + } + if (pattern.length() == 2 && pattern.startsWith("\\") && Character.isLetterOrDigit(pattern.charAt(1)) == false) { + return FoxSignature.getFoxSignature(pattern.substring(1)); + } + if (pattern.equals("\\<\\>") || pattern.equals("(\\<\\<.*\\>\\>)")) { + return FoxSignature.getFoxSignature("<>"); + } + if (pattern.equals("\\<-\\>")) { + return FoxSignature.getFoxSignature("<->"); + } + if (pattern.equals("(-+)")) { + return FoxSignature.getFoxSignature("-"); + } + if (pattern.equals("\\|+") || pattern.equals("\\|\\|")) { + return FoxSignature.getFoxSignature("|"); + } + if (pattern.equals("([*]+)")) { + return FoxSignature.getFoxSignature("*"); + } + if (pattern.equals("[%s]+") || pattern.equals("[%s]*")) { + return 0; + } +// synchronized (UNKNOWN) { +// final boolean changed = UNKNOWN.add(pattern); +// if (changed) +// System.err.println("unknow=" + pattern); +// +// } + return 0; + } + } |