summaryrefslogtreecommitdiff
path: root/src/net/sourceforge/plantuml/command/regex/RegexLeaf.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/net/sourceforge/plantuml/command/regex/RegexLeaf.java')
-rw-r--r--src/net/sourceforge/plantuml/command/regex/RegexLeaf.java104
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;
+ }
+
}