#java #regex #string #split #tokenize
#java #регулярное выражение #строка #разделение #маркировать
Вопрос:
в Java, если у меня есть строка с таким форматом:
( string1 , string2 ) ( string2 ) ( string4 , string5 , string6 ) [s2]
Как я могу разделить строку, чтобы получить массив string таким образом?
string1 , string2
string2
string4 , string5 , string6
Комментарии:
1. Вам нужен один массив строк или массив массивов строк?
Ответ №1:
Попробуйте это:
String test = "( string1 , string2 ) ( string2 ) ( string4 , string5 , string6 ) [s2]";
String[] splits = test.split("\(\s*|\)[^\(]*\(?\s*");
for (String split : splits) {
System.out.println(split);
}
Комментарии:
1. 1
split()
немного проще по концепции, но я бы либо добавил немного, чтобы соответствовать любому пробелу перед закрывающими скобками, а также после открывающих, либо удалил пробелы, соответствующие всем вместе.
Ответ №2:
Вы можете использовать совпадение :
List<String> matchList = new ArrayList<String>();
Pattern regex = Pattern.compile("\((.*?)\)");
Matcher regexMatcher = regex.matcher(subjectString);
while (regexMatcher.find()) {
matchList.add(regexMatcher.group(1));
}
Сопоставляет что-либо между () и сохраняет это в обратной ссылке 1.
Объяснение :
"\(" // Match the character “(” literally
"(" // Match the regular expression below and capture its match into backreference number 1
"." // Match any single character that is not a line break character
"*?" // Between zero and unlimited times, as few times as possible, expanding as needed (lazy)
")"
"\)" // Match the character “)” literally
Ответ №3:
Возможно, вы захотите использовать split на /(. ?)/
— что-то вроде этого в java:
Pattern p = Pattern.compile("\(. ?\)");
Matcher m = p.matcher(myString);
ArrayList<String> ar = new ArrayList<String>();
while (m.find()) {
ar.add(m.group());
}
String[] result = new String[ar.size()];
result = ar.toArray(result);