summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--base/src/main/java/bjc/utils/funcutils/StringUtils.java127
1 files changed, 121 insertions, 6 deletions
diff --git a/base/src/main/java/bjc/utils/funcutils/StringUtils.java b/base/src/main/java/bjc/utils/funcutils/StringUtils.java
index 375751c..84409a4 100644
--- a/base/src/main/java/bjc/utils/funcutils/StringUtils.java
+++ b/base/src/main/java/bjc/utils/funcutils/StringUtils.java
@@ -240,9 +240,9 @@ public class StringUtils {
*/
public static List<String> processArguments(String com) {
List<String> strings = new ArrayList<>();
-
+
BooleanToggle togg = new BooleanToggle();
-
+
for(String strang : TokenUtils.removeDQuotedStrings(com)) {
if(togg.get()) {
strings.add(TokenUtils.descapeString(strang));
@@ -259,8 +259,13 @@ public class StringUtils {
int nestLevel = 0;
int i = 0;
+ boolean prevCharWasSlash = false;
+ boolean inString = false;
+
+ char stringEnder = ' ';
+
while(i < haystack.length()) {
- if(nestLevel == 0) {
+ if(inString == false && nestLevel == 0) {
for(String needle : needles) {
if(haystack.regionMatches(i, needle, 0, needle.length())) {
return true;
@@ -268,7 +273,22 @@ public class StringUtils {
}
}
- switch(haystack.charAt(i)) {
+ if(inString) {
+ if(prevCharWasSlash == true) {
+ prevCharWasSlash = false;
+ } else if (haystack.charAt(i) == stringEnder) {
+ inString = false;
+ }
+ } else {
+ switch(haystack.charAt(i)) {
+ case '\'':
+ inString = true;
+ stringEnder = '\'';
+ break;
+ case '\"':
+ inString = true;
+ stringEnder = '\"';
+ break;
case '(':
case '[':
case '{':
@@ -281,6 +301,7 @@ public class StringUtils {
case '>':
nestLevel = Math.max(0, nestLevel - 1);
break;
+ }
}
i += 1;
@@ -301,8 +322,13 @@ public class StringUtils {
int nestLevel = 0;
int i = 0;
+ boolean prevCharWasSlash = false;
+ boolean inString = false;
+
+ char stringEnder = ' ';
+
while(i < work.length()) {
- if(nestLevel == 0) {
+ if(inString == false && nestLevel == 0) {
for(String split : splits) {
if(work.regionMatches(i, split, 0, split.length())) {
strangs.add(work.substring(0, i));
@@ -317,7 +343,22 @@ public class StringUtils {
}
}
- switch(work.charAt(i)) {
+ if(inString) {
+ if(prevCharWasSlash == true) {
+ prevCharWasSlash = false;
+ } else if (work.charAt(i) == stringEnder) {
+ inString = false;
+ }
+ } else {
+ switch(work.charAt(i)) {
+ case '\'':
+ inString = true;
+ stringEnder = '\'';
+ break;
+ case '\"':
+ inString = true;
+ stringEnder = '\"';
+ break;
case '(':
case '[':
case '{':
@@ -330,6 +371,80 @@ public class StringUtils {
case '>':
nestLevel = Math.max(0, nestLevel - 1);
break;
+ }
+ }
+
+ i += 1;
+ }
+
+ strangs.add(work);
+
+ return strangs;
+ }
+
+ public static List<String> levelSplitRX(String phrase, String patt) {
+ return levelSplit(phrase, false, patt);
+ }
+
+ public static List<String> levelSplitRX(String phrase, boolean keepDelims, String patt) {
+ Pattern pat = Pattern.compile(patt);
+
+ String work = phrase;
+ Matcher mat = pat.matcher(work);
+
+ List<String> strangs = new ArrayList<>();
+
+ int nestLevel = 0;
+ int i = 0;
+
+ boolean prevCharWasSlash = false;
+ boolean inString = false;
+
+ char stringEnder = ' ';
+
+ while(i < work.length()) {
+ if(inString == false && nestLevel == 0) {
+ if(mat.find(i)) {
+ strangs.add(work.substring(0, i));
+ if(keepDelims) strangs.add(mat.group());
+ work = work.substring(mat.end());
+ i = 0;
+
+ mat = pat.matcher(work);
+
+ continue;
+ }
+ }
+
+ if(inString) {
+ if(prevCharWasSlash == true) {
+ prevCharWasSlash = false;
+ } else if (work.charAt(i) == stringEnder) {
+ inString = false;
+ }
+ } else {
+ switch(work.charAt(i)) {
+ case '\'':
+ inString = true;
+ stringEnder = '\'';
+ break;
+ case '\"':
+ inString = true;
+ stringEnder = '\"';
+ break;
+ case '(':
+ case '[':
+ case '{':
+ case '<':
+ nestLevel += 1;
+ break;
+ case ')':
+ case ']':
+ case '}':
+ case '>':
+ nestLevel = Math.max(0, nestLevel - 1);
+ break;
+ }
}
i += 1;