В D, используя библиотеку std.regex, как вы сопоставляете точку? - PullRequest
6 голосов
/ 31 декабря 2011

Это может звучать глупо, но в D (с использованием std.regex ), как вы сопоставляете буквальную точку в строке?

Использование этогоКод я проверяю расширение файла .bmp, поэтому я выполняю простое сравнение с регулярным выражением.Если я пытаюсь избежать этой точки, я получаю сообщение об ошибке.

Regex!char Pattern = regex("\.bmp$", "i");

if (match(FileName, Pattern).empty)
{
    FileName ~= ".bmp";
}

Error: Undefined escape sequence \.

Даже в документации 1014 * в ней не упоминаются совпадающие точки.

Есть идеи?

Ответы [ 2 ]

10 голосов
/ 31 декабря 2011

Ваша строка "\.bmp$" экранирована сама по себе, отсюда и ошибка. D думает, что вы пытаетесь экранировать . в строке, но \. не является допустимой escape-последовательностью.

Обратите внимание, что это не относится к D; C ++ выдает ту же ошибку .

const char* regex = "\.bmp$";  

Компиляция с g ++ 4.3.4 дает:

prog.cpp:1: error: unknown escape sequence '\.'

У вас есть два варианта:

  1. Избегайте \ в вашей строке, т.е. "\\.bmp$".
  2. Использовать строковый литератор, т. Е. r"\.bmp$". Необработанные строковые литералы игнорируют все escape-последовательности. Они разработаны специально для таких вещей, как шаблоны регулярных выражений.
8 голосов
/ 31 декабря 2011

Полагаю, вам нужно дважды убежать от него (вы хотите \. в регулярном выражении). В вашем текущем коде вы одиночно избегаете его, поэтому D пытается интерпретировать его как нечто для себя, а не для регулярных выражений. Двойное экранирование говорит D, что вам нужен литерал \ в строке.

Итак, в итоге все должно выглядеть как "\\.bmp$".

...