我有一些字符串如下:
String str = "Data[tableName=hello,schemaName=test,columns=[column[name=h1,key=true],column[name=h2,keys=false]]]";
如何使用regex(如(),(),()来划分字符串以获取:
列由列组成,至少可以出现一次。
答案 0 :(得分:1)
假设Data[
和上一个]
或多或少是固定的(比如Data
是一个变量),我们可能会使用replaceAll("^[^\\]\\[]+\\[|\\]$","")
来删除这些值(所有在开始之后不是[
和]
而[
之后是]
,最后是public static List<String> splitWithCommaOutsideBrackets(String input) {
int BracketCount = 0;
int start = 0;
List<String> result = new ArrayList<>();
for(int i=0; i<input.length(); i++) {
switch(input.charAt(i)) {
case ',':
if(BracketCount == 0) {
result.add(input.substring(start, i).trim());// Trims the item!
start = i+1;
}
break;
case '[':
BracketCount++;
break;
case ']':
BracketCount--;
if(BracketCount < 0)
return result; // The BracketCount shows the [ and ] number is unbalanced
break;
}
}
if (BracketCount > 0)
return result; // Missing closing ]
result.add(input.substring(start).trim()); // Trims the item!
return result;
}
,并使用以下方法解析其余部分:
String input = "Data[tableName=hello,schemaName=test,columns=[column[name=h1,key=true],column[name=h2,keys=false]]]";
List<String> res = splitWithCommaOutsideBrackets(input.replaceAll("^[^\\]\\[]+\\[|\\]$",""));
for (String t: res) {
System.out.println(t); // Printing the results
}
并将其用作
=INDEX(A:A,MATCH(F4,B:B,0))
请参阅Java demo。
答案 1 :(得分:1)
首先,您的描述应该更清楚 假设String看起来像“Data [*,*,*]”,您可以通过regex表达式获取“Data []”中的内容。现在你有了“*,*,*”,String.split()是一个好主意。
示例代码:
String str = "Data[tableName=hello,schemaName=test,columns=[column[name=h1,key=true]]]";
String regex = "^Data\\[(.+)\\]$";
Matcher m = Pattern.compile(regex).matcher(str);
if (m.find()) {
if (m.group(1) != null) {
String content = m.group(1);
String[] split = content.split(",", 3);
String tableName = split[0];
String schemaName = split[1];
String columns = split[2];
System.out.println(tableName);
System.out.println(schemaName);
System.out.println(columns);
}
}
结果:
tableName=hello
schemaName=test
columns=[column[name=h1,key=true],column[name=h2,keys=false]]