Так я бы решил вашу проблему (она полностью отличается от вашего кода, но работает).
Прежде всего удалите кавычки, а также начальные и конечные символы, не являющиеся словами.Это можно сделать с помощью replaceAll
:
String Formatted = Line.replaceAll( "(^\"[.&]*)|([.&]*\"$)", "" );
Регулярное выражение в первом аргументе будет соответствовать двойным кавычкам на обоих концах, а также ведущим и конечным .
s и &
s.Метод возвратит новую строку, в которой удаляются совпадающие символы, поскольку второй аргумент является пустой строкой (он заменяется пустой строкой).
Теперь вы можете разбить эту строку на каждый .
, используяsplit
метод.Вы можете определить выходной массив только после этого вызова:
String[] StringGroups = Formatted.split( "\\." );
String[][] Elements = new String[StringGroups.length][];
Используйте обратную косую черту (\\
) перед точкой, чтобы указать, что он должен разделяться на .
-символы, так как этот метод принимаетрегулярное выражение (и просто .
разделяется на любой не-символ новой строки).
Теперь разделите каждую строку в этом массиве на каждый &
, используя тот же метод split
.Добавьте результат непосредственно в массив Elements
:
// Loop over the array
int MaxLength = 0;
for( int i = 0; i < StringGroups.length; i ++ ) {
String StrGroup = StringGroups[ i ];
String[] Group = StrGroup.split( "&" );
Elements[ i ] = Group;
// Measure the max length
if( Group.length > MaxLength ) {
MaxLength = Group.length;
}
}
A \\
не требуется для ввода, поскольку &
просто соответствует &
-символам.Теперь вам нужно только заполнить ваши данные в массив.Переменная MaxLength
предназначена для добавления значений null
в ваш массив.Если они вам не нужны, просто удалите их, и все готово.
Если вы хотите получить значения null
, переберите массив элементов и скопируйте текущие строки в новые массивы:
for( int i = 0; i < Elements.length; i ++ ) {
String[] Current = Elements[ i ];
String[] New = new String[ MaxLength ];
// Copy existing values into new array, extra values remain null
System.arraycopy( Current, 0, New, 0, Current.length );
Elements[ i ] = New;
}
Теперь массив Elements
содержит именно то, что вы хотели.
Вот полный исполняемый код:
public class StringSplitterExample {
public static void main( String[] args ) {
test( "\".Word.Characters&Numeric&Letters.Typos&Mistypes.\"" );
System.out.println(); // Line between
test( "\".Alpha.Beta.Zeta&Iota.\"" );
}
public static void test( String Line ) {
String Formatted = Line.replaceAll( "(^\"[.&]*)|([.&]*\"$)", "" );
String[] StringGroups = Formatted.split( "\\." );
String[][] Elements = new String[StringGroups.length][];
// Loop over the array
int MaxLength = 0;
for( int i = 0; i < StringGroups.length; i ++ ) {
String StrGroup = StringGroups[ i ];
String[] Group = StrGroup.split( "&" );
Elements[ i ] = Group;
// Measure the max length
if( Group.length > MaxLength ) {
MaxLength = Group.length;
}
}
for( int i = 0; i < Elements.length; i ++ ) {
String[] Current = Elements[ i ];
String[] New = new String[ MaxLength ];
// Copy existing values into new array, extra values remain null
System.arraycopy( Current, 0, New, 0, Current.length );
Elements[ i ] = New;
}
for( String[] Group : Elements ) {
for( String String : Group ) {
System.out.print( String );
System.out.print( " " );
}
System.out.println();
}
}
}
Вывод этого примера:
Word null null
Characters Numeric Letters
Typos Mistypes null
Alpha null
Beta null
Zeta Iota
Так что это работает, и вам даже не нужно знать, где находятся символы .
и &
в вашей строке.Java сделает это за вас.