summaryrefslogtreecommitdiff
path: root/base/src
diff options
context:
space:
mode:
Diffstat (limited to 'base/src')
-rw-r--r--base/src/main/java/bjc/utils/ioutils/LevelSplitter.java28
-rw-r--r--base/src/test/java/bjc/utils/ioutils/LevelSplitterTest.java50
2 files changed, 65 insertions, 13 deletions
diff --git a/base/src/main/java/bjc/utils/ioutils/LevelSplitter.java b/base/src/main/java/bjc/utils/ioutils/LevelSplitter.java
index 5798ad0..5d24661 100644
--- a/base/src/main/java/bjc/utils/ioutils/LevelSplitter.java
+++ b/base/src/main/java/bjc/utils/ioutils/LevelSplitter.java
@@ -1,6 +1,8 @@
package bjc.utils.ioutils;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.LinkedList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -43,9 +45,7 @@ public class LevelSplitter {
while (i < haystack.length()) {
if (inString == false && nestLevel == 0) {
for (String needle : needles) {
- if (haystack.regionMatches(i, needle, 0, needle.length())) {
- return true;
- }
+ if (haystack.regionMatches(i, needle, 0, needle.length())) { return true; }
}
}
@@ -99,7 +99,7 @@ public class LevelSplitter {
public List<String> levelSplit(String phrase, String... splits) {
return levelSplit(phrase, false, splits);
}
-
+
/**
* Split a string, respecting groups.
*
@@ -199,15 +199,14 @@ public class LevelSplitter {
// This doesn't seem like its working
@SuppressWarnings("javadoc")
public List<String> levelSplitRX(String phrase, String patt) {
- return levelSplit(phrase, false, patt);
+ return levelSplitRX(phrase, false, patt);
}
@SuppressWarnings("javadoc")
public List<String> levelSplitRX(String phrase, boolean keepDelims, String patt) {
Pattern pat = Pattern.compile(patt);
- String work = phrase;
- Matcher mat = pat.matcher(work);
+ Matcher mat = pat.matcher(phrase);
List<String> strangs = new ArrayList<>();
@@ -220,12 +219,15 @@ public class LevelSplitter {
char stringEnder = ' ';
- while (i < work.length()) {
- mat.region(lastMatch, phrase.length());
+ while ((lastMatch + i) < phrase.length()) {
+ int ai = lastMatch + i;
+
+ mat.region(lastMatch + i, phrase.length());
if (inString == false && nestLevel == 0) {
if (mat.lookingAt()) {
- strangs.add(work.substring(lastMatch, mat.start()));
+
+ strangs.add(phrase.substring(lastMatch, mat.start()));
if (keepDelims) strangs.add(mat.group());
lastMatch = mat.end();
//work = work.substring(mat.end());
@@ -239,11 +241,11 @@ public class LevelSplitter {
if (inString) {
if (prevCharWasSlash == true) {
prevCharWasSlash = false;
- } else if (work.charAt(i) == stringEnder) {
+ } else if (phrase.charAt(ai) == stringEnder) {
inString = false;
}
} else {
- switch (work.charAt(i)) {
+ switch (phrase.charAt(ai)) {
case '\'':
inString = true;
stringEnder = '\'';
@@ -270,7 +272,7 @@ public class LevelSplitter {
i += 1;
}
- strangs.add(work);
+ strangs.add(phrase.substring(lastMatch));
return strangs;
}
diff --git a/base/src/test/java/bjc/utils/ioutils/LevelSplitterTest.java b/base/src/test/java/bjc/utils/ioutils/LevelSplitterTest.java
new file mode 100644
index 0000000..30ec919
--- /dev/null
+++ b/base/src/test/java/bjc/utils/ioutils/LevelSplitterTest.java
@@ -0,0 +1,50 @@
+package bjc.utils.ioutils;
+
+import static org.junit.Assert.*;
+
+import java.util.Arrays;
+import java.util.List;
+
+import org.junit.Test;
+import static bjc.utils.funcutils.TestUtils.*;
+import static bjc.utils.ioutils.LevelSplitterTest.RXPair.pair;
+
+/**
+ * Test of LevelSplitter.
+ *
+ * @author bjculkin
+ *
+ */
+public class LevelSplitterTest {
+ static final class RXPair {
+ public String inp;
+ public String[] outp;
+
+ public RXPair(String inp, String... outp) {
+ this.inp = inp;
+ this.outp = outp;
+ }
+
+ public static RXPair pair(String inp, String... outp) {
+ return new RXPair(inp, outp);
+ }
+ }
+
+ /**
+ * Test regex splitter.
+ */
+ @Test
+ public void testRXSplit() {
+ LevelSplitter splitter = LevelSplitter.def;
+
+ // Check generic splitting works
+ assertRXSplit("\\s+", pair("", ""), pair("a", "a"), pair("a b", "a", "b"), pair("a b", "a", "b"),
+ pair("a\t \tb", "a", "b"));
+ }
+
+ private static void assertRXSplit(String pat, RXPair... pairs) {
+ for (RXPair pair : pairs) {
+ assertListEquals(LevelSplitter.def.levelSplitRX(pair.inp, pat), pair.outp);
+ }
+ }
+}