Как мне избежать строковых литералов, используя регулярное выражение для моего лексера? - PullRequest
0 голосов
/ 23 мая 2018

Сейчас я пишу лексер, и я хочу иметь возможность сопоставлять строковый токен с учетом управляющих символов.

Итак, я хочу иметь возможность разбирать такие вещи:

  • 'Hello World' как [', Hello World, '],
  • 'There\'s an apostrophe in here' как [', There's an apostrophe in here, ']
  • 'This is a backslash: \\' как [', This is a backslash: \, '].

В настоящее время у меня есть следующее правило регулярных выражений для сопоставления строк: /^\s*(')(.*?)(')/s.^\s* учитывает начальный пробел, а (')(.*?)(') соответствует строке 3 раза: открывающий токен, сама строка и, наконец, закрывающий токен.После того, как я узнал токен, я помещаю соответствующие токены в массив и удаляю полное совпадение с начала данных, с которыми я работаю.

Я пытался изменить свое правило для учетной записи.для сбежавших персонажей, но я не смог заставить это работать, и, честно говоря, я не знаю, куда идти дальше.Я в недоумении, что даже попробовать.Если я проверю обратную косую черту, она не будет работать на двоих.Если я проверю на два, он не сработает на три и т. Д.

Может ли кто-нибудь поставить меня на правильный путь, как это реализовать?На этом мой лексер уже закончил и делает то, что должен.Это единственное, что осталось.

1 Ответ

0 голосов
/ 23 мая 2018

Вы можете использовать

/^\s*(')([^'\\]*(?:\\.[^'\\]*)*)(')/s

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • \s* - 0+ пробельных символов
  • (') - Группа захвата # 1: a ' char
  • ([^'\\]*(?:\\.[^'\\]*)*) - Capturingгруппа № 2:
    • [^'\\]* - 0+ символов, отличных от ' и \
    • (?:\\.[^'\\]*)* - 0 или более повторений:
      • \\. - \ с последующим любым символом
      • [^'\\]* - 0+ символов, кроме ' и \
  • (') - Группа захвата № 3: a '.
...