Регулярное выражение: разделение по символам, кроме кавычек

Много раз, когда вы анализируете текст, вам нужно разделить строки на символ запятой (или новые строки, вкладки и т. Д.), Но что тогда, если вам нужно было использовать запятую в своей строке, а не разделять ее? Примером этого может быть большое количество. Так что, возможно, у нас была бы такая строка: возраст: 28, любимое число: 26, зарплата: 1,234,108 долларов Разделение запятыми даст: возраст: 28 любимое число: 26 зарплата: 1 234 108 долларов Близко, но не совсем. Для форматирования многие числа имеют c

Много раз, когда вы анализируете текст, вам нужно разделить строки на символ запятой (или новые строки, вкладки и т. Д.), Но что тогда, если вам нужно было использовать запятую в своей строке, а не разделять ее? Примером этого может быть большое количество. Так что, возможно, у нас будет такая строка:

 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 

Эта строка регулярного выражения использует так называемый «позитивный просмотр вперед» для проверки кавычек без фактического сопоставления с ними .

Это действительно мощная функция регулярных выражений, но ее сложно реализовать.

Чтобы попрактиковаться, попробуйте взглянуть на заданное нами регулярное выражение и посмотреть, можете ли вы изменить его, чтобы разделить его на другой символ, например точку с запятой ( ; ). Если это было легко, попробуйте изменить его так, чтобы он видел по две кавычки с каждой стороны строки.

У вас есть более простая строка регулярного выражения или несколько советов по их созданию? Дайте нам знать об этом в комментариях!

comments powered by Disqus