Много раз, когда вы анализируете текст, вам нужно разделить строки на символ запятой (или новые строки, вкладки и т. Д.), Но что тогда, если вам нужно было использовать запятую в своей строке, а не разделять ее? Примером этого может быть большое количество. Так что, возможно, у нас будет такая строка:
age: 28, favorite number: 26, salary: $1,234,108
Разделение запятыми даст:
age: 28
favorite number: 26
salary: $1
234
108
Близко, но не совсем.
Для целей форматирования многие числа имеют такие запятые, поэтому мы не можем этого избежать.
Один из способов решить эту проблему - заключить строку в кавычки, которые не следует разделять. Итак, наш пример сверху будет выглядеть так:
age: 28, favorite number: 26, "salary: $1,234,108"
Итак, теперь, чтобы разделить это, нам нужно создать строку регулярного выражения, в которой говорится «разделить на все символы запятой, если она не находится между кавычками».
Используя Java и Regex, это должно работать:
String[] strArray = text.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
Используя приведенную выше строку регулярного выражения, вот как мы разделим строку с помощью Java:
String input = "age: 28, favorite number: 26, \"salary: $1,234,108\"";
String[] splits = input.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)");
for (int i = 0; i < splits.length; i++) {
System.out.println(splits[i].trim());
}
// Output:
// age: 28
// favorite number: 26
// salary: $1,234,108
Эта строка регулярного выражения использует так называемый «позитивный просмотр вперед» для проверки кавычек без фактического сопоставления с ними .
Это действительно мощная функция регулярных выражений, но ее сложно реализовать.
Чтобы попрактиковаться, попробуйте взглянуть на заданное нами регулярное
выражение и посмотреть, можете ли вы изменить его, чтобы разделить его
на другой символ, например точку с запятой ( ;
). Если это было легко,
попробуйте изменить его так, чтобы он видел по две кавычки с каждой
стороны строки.
У вас есть более простая строка регулярного выражения или несколько советов по их созданию? Дайте нам знать об этом в комментариях!