Практика «Поля в кавычках»
В этой серии задач вам нужно реализовать парсер полей. Парсером обычно называют алгоритм, который из текста делает набор объектов, представленных в этом тексте.
Итак, на вход нашего парсера подается строка текста. На выход нужно вернуть массив полей, извлечённых из текста по описанным ниже правилам, либо пустой массив, если полей нет.
Проверить работу парсера можно запустив программу. Появится окно, в котором можно вводить разные входные строки и смотреть, на какие поля эти строки разбиваются.
Типы полей
Поля могут быть двух типов: простые и поля в кавычках.
Простые поля
Простые поля не могут быть пустыми, не могут содержать пробелов и разделяются одним или несколькими пробелами.
Поля в кавычках
Ограничены с двух сторон парными кавычками одного из двух типов: двойными "
и одинарными '
.
Кавычки разных типов могут быть вложенными. То есть строка "a 'b' 'c' d" '"1" "2" "3"'
содержит два поля a 'b' 'c' d
и "1" "2" "3"
.
Могут содержать пробелы и быть пустыми. То есть строка '' "bcd ef" 'x y'
содержит три поля пустое поле, bcd ef
и x y
.
Поля, заключенные в кавычки, могут не отделяться от других полей пробелами. То есть строка a"b c d e"f
содержит 3 поля a
, b c d e
и f
.
Кавычки в конце строки можно не закрывать. Если в строке отсутствует
последняя парная закрывающая кавычка, считать, что соответствующее поле
заканчивается в конце строки. То есть строка abc "def g h
содержит два поля.
Поле внутри кавычек может содержать символы кавычек, экранированные символом ‘\’ (другими словами пара символов \» интерпретируется как символ кавычки, являющийся частью поля.
Символ ‘\’ также может быть экранирован самим же собой.
То есть строка "a \"c\""
содержит одно поле, а строка "\\" b
— два поля.
В простых полях символ ‘\’ не считается экранирующим символом, поэтому строка \\
— это одно поле из двух слэшей, а \"a b\"
— это два поля \
и a b"
Игнорируйте пробелы в начале или в конце строки, если они не входят в поле.
Концепция токена
При решении задач разбора текста, например, вычленении из строки фрагментов, приходится отслеживать 2 вещи:
- Проинтерпретированное значение, соответствующее фрагменту. Например, значение фрагмента
"a\"b"
это три символа:a
, символ кавычки иb
, хотя сам фрагмент имеет длину 6 символов. - Позицию фрагмента в строке.
Для этого удобно завести свой тип и хранить там эту информацию.
Этот тип уже создан для вас — найдите и изучите в проекте класс Token
.
Фрагменты, выделяемые из текста часто называют токенами или лексемами. Мы дальше будем называть их токенами.
Иллюстрация поясняющая семантику свойств класса Token при анализе текста:
1 2 3 4 5 6 7 8 9 10 11 12 |
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using NUnit.Framework; namespace TableParser { [TestFixture] public class QuotedFieldTaskTests { |
Стоимость решения этой задачи всего 100 рублей, купи решения у меня 🙂