Регулярное выражение Coffeescript не соответствует назначению

Я пытаюсь написать сценарий hubot, который отвечает на два разных типа ввода. Пользователь может либо ввести название остановки местного общественного транспорта, либо опционально добавить к нему задержку.

Таким образом, ввод может быть dvb zellescher weg или dvb albertplatz для первого варианта или dvb zellescher weg in 5 или dvb albertplatz in 10 для второго. («dvb» здесь — ключевое слово для моего сценария, а «zellescher weg» и «albertplatz» — два примера названий остановок)

При попытке сопоставить их с регулярным выражением я столкнулся с проблемой, когда регулярное выражение, с которым я работал на разных сайтах тестирования (например, regex101, которое, кажется, рекомендуется здесь и делает JS), не будет работать в моем коде. Регулярное выражение для сопоставления ввода без числа — /^dvb (\D*)$/, и я использую /dvb\s+(.*)in (\d*)/ для соответствия случаям, когда пользователь ввел задержку.

Минимальный пример кода для моего hubot, который не подходит по неизвестным мне причинам, выглядит так:

robot.respond /^dvb (\D*)$/, (res) ->
    hst = res.match[1]
    res.send hst

Спасибо за любую помощь в этом.


person Kilian    schedule 28.07.2015    source источник
comment
если вы хотите объединить два регулярных выражения... /^dvb\s+(\D+)(\sin\s\d+|)$/   -  person Jaromanda X    schedule 28.07.2015


Ответы (1)


Согласно источнику respond комментария к коду:

# Общедоступный: добавляет прослушиватель, который пытается сопоставить входящие сообщения, направленные
# роботу, на основе регулярного выражения. Все регулярные выражения обрабатывают шаблоны так, будто они начинаются
# с '^'
.

Регулярное выражение из respond переходит к respondPattern, экранирующий ^ и предупреждающий об использовании привязок:

if re[0] and re[0][0] is '^'
      @logger.warning \
        "Anchors don't work well with respond, perhaps you want to use 'hear'"

Итак, вам нужно либо удалить ^, либо использовать .hear метод, не использующий "умную" предварительную обработку регулярных выражений:

hear: (regex, options, callback) ->
    @listeners.push new TextListener(@, regex, options, callback)
person Wiktor Stribiżew    schedule 28.07.2015
comment
Ого, вот в чем дело? Только что удалил ^ и вроде все работает, спасибо! Использование hear также сработает, но я бы предпочел respond. - person Kilian; 28.07.2015