Я хочу преобразовать эту строку:
String s = "[\"val1\", \"val2\", \"val3\"]";
в массив или ArrayList (без регулярного выражения и разделения). Это из базы данных, и это общее. Также возможно использование запятых внутри высоких кавычек.
Это возможно?
да, у меня есть решение с регулярным выражением. Мой вопрос в том, есть ли простое решение для этого в java? @Mickael
почему вы спрашиваете, возможно ли это, если у вас уже есть решение ..
потому что речь идет о том, есть ли лучшее решение, чем его анализ с помощью регулярного выражения и создание массива. Может быть, есть хорошая библиотека или метод. Похоже, String [] toString ... (тот же формат)
Вы пробовали использовать метод разделения в классе String? docs.oracle.com/javase/9/docs/api/java/lang/…. Вы можете использовать это как String [] array = s.split (",");
@fpezzini он сказал "без регулярного выражения и разделения" ...
Спасибо, @Calaf, извини, что я неправильно это понял. ОП: Почему нельзя использовать ни метод разделения, ни регулярное выражение? Это самые простые и быстрые варианты.
Это JSON, поэтому возможно использование библиотеки JSON или использования Java Scripting API.




Вы можете использовать Строковый токенизатор и установить в качестве разделителей " \",[]".
Это мой пример. Я использовал массив, но его очень просто преобразовать в ArrayList, если хотите.
public static void main(String[] args) {
String s = "[\"val1\", \"val2\", \"val3\"]";
String delims = " \",[]";
StringTokenizer st = new StringTokenizer(s, delims);
System.out.println("Num of Token = " + st.countTokens());
String[] myArr= new String[st.countTokens()];
for(int i=0; i<myArr.length && st.hasMoreTokens(); i++)
myArr[i]=st.nextToken();
//output
System.out.println(Arrays.toString(myArr));
}
Ваш вывод будет:
Num of Token = 3
[val1, val2, val3]
К сожалению, не существует Java API, который бы анализировал этот список напрямую.
Этот фрагмент будет работать для этой строки:
String s = "[\"val1\", \"val2\", \"val3\"]";
String[] arr = s.replace("[", "").replace("]", "").split("\\s*,\\s*");
List<String> list = Arrays.asList(arr);
Если строка содержит [ или ] где-то еще, то приведенный выше фрагмент не будет работать.
Предлагаю разобраться, что это. Это массив JSON? Затем используйте парсер JSON. Это csv с дополнительными [ и ]? Затем используйте парсер CSV.
String json = "[\"val1\", \"val2\", \"val3\"]";
JSONArray jsonarray = new JSONArray(json);
List<Object> objects = jsonarray.toList();
Спасибо @TamasRev
Да, есть способ использовать Regex.
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
class T1 {
public static void main(String[] args) {
final String REGEX = "\\b([\\w]+)\\b";
String INPUT = "[\"val1\", \"val2\", \"val3\"]";
Pattern p = Pattern.compile(REGEX);
Matcher m = p.matcher(INPUT); // get a matcher object
List<String> myList = new ArrayList<>();
while(m.find()) {
myList.add(m.group());
}
System.out.println(myList);
}
}
Здравствуйте, вы пробовали регулярное выражение?