aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/traccar/helper/PatternBuilder.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/traccar/helper/PatternBuilder.java')
-rw-r--r--src/main/java/org/traccar/helper/PatternBuilder.java98
1 files changed, 98 insertions, 0 deletions
diff --git a/src/main/java/org/traccar/helper/PatternBuilder.java b/src/main/java/org/traccar/helper/PatternBuilder.java
new file mode 100644
index 000000000..5c4638189
--- /dev/null
+++ b/src/main/java/org/traccar/helper/PatternBuilder.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright 2015 Anton Tananaev (anton@traccar.org)
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.traccar.helper;
+
+import java.util.ArrayList;
+import java.util.regex.Pattern;
+
+public class PatternBuilder {
+
+ private final ArrayList<String> fragments = new ArrayList<>();
+
+ public PatternBuilder optional() {
+ return optional(1);
+ }
+
+ public PatternBuilder optional(int count) {
+ fragments.add(fragments.size() - count, "(?:");
+ fragments.add(")?");
+ return this;
+ }
+
+ public PatternBuilder expression(String s) {
+ s = s.replaceAll("\\|$", "\\\\|"); // special case for delimiter
+
+ fragments.add(s);
+ return this;
+ }
+
+ public PatternBuilder text(String s) {
+ fragments.add(s.replaceAll("([\\\\\\.\\[\\{\\(\\)\\*\\+\\?\\^\\$\\|])", "\\\\$1"));
+ return this;
+ }
+
+ public PatternBuilder number(String s) {
+ s = s.replace("dddd", "d{4}").replace("ddd", "d{3}").replace("dd", "d{2}");
+ s = s.replace("xxxx", "x{4}").replace("xxx", "x{3}").replace("xx", "x{2}");
+
+ s = s.replace("d", "\\d").replace("x", "[0-9a-fA-F]").replaceAll("([\\.])", "\\\\$1");
+ s = s.replaceAll("\\|$", "\\\\|").replaceAll("^\\|", "\\\\|"); // special case for delimiter
+
+ fragments.add(s);
+ return this;
+ }
+
+ public PatternBuilder any() {
+ fragments.add(".*");
+ return this;
+ }
+
+ public PatternBuilder binary(String s) {
+ fragments.add(s.replaceAll("(\\p{XDigit}{2})", "\\\\$1"));
+ return this;
+ }
+
+ public PatternBuilder or() {
+ fragments.add("|");
+ return this;
+ }
+
+ public PatternBuilder groupBegin() {
+ return expression("(?:");
+ }
+
+ public PatternBuilder groupEnd() {
+ return expression(")");
+ }
+
+ public PatternBuilder groupEnd(String s) {
+ return expression(")" + s);
+ }
+
+ public Pattern compile() {
+ return Pattern.compile(toString(), Pattern.DOTALL);
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder();
+ for (String fragment : fragments) {
+ builder.append(fragment);
+ }
+ return builder.toString();
+ }
+
+}