разделенная строка java

#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);