2011-12-31 10 views
6

To może brzmieć jak głupie pytanie, ale w D (używając std.regex) jak dopasować literalną kropkę w ciągu znaków?W D przy użyciu biblioteki std.regex, jak dopasować kropkę?

Za pomocą tego kodu sprawdzam rozszerzenie pliku .bmp, więc wykonuję proste dopasowanie do wyrażenia regularnego. Jeśli spróbuję uciec z tego punktu, otrzymam błąd.

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

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

Error: Undefined escape sequence \.

Nawet w documentation nie wspomina pasujące kropki.

Wszelkie pomysły?

+0

Czy '' 'specjalne w D? – fge

+0

@fge Jest to standardowy sposób dopasowywania końca ciągu (lub linii w trybie wieloliniowym). –

+0

Wiem o tym. Zastanawiam się tylko, czy przypadkiem D_język nie wymaga od niego ucieczki, aby było dosłownie w ciągu znaków (a zatem '$' w regex). – fge

Odpowiedz

8

Zgaduję, że musisz podwoić to (chcesz \. w regex). W twoim bieżącym kodzie, jesteś singlem uciekającym, więc D próbuje zinterpretować to jako coś dla siebie, nie dla regex. Podwójne uciekanie mówi D, że chcesz literał \ w ciągu.

Ostatecznie powinno to wyglądać tak: "\\.bmp$".

+0

+1. Przydatne może być jednoznaczne podwójne uciekanie: "\\. Bmp $" – orip

+0

To działa. Podwójnie uciekłem i wszystko działa dobrze, dzięki! –

10

Twój ciąg znaków "\.bmp$" jest unikany, stąd błąd. D myśli, że próbujesz uciec z . w ciągu znaków, ale \. nie jest prawidłową sekwencją ucieczki.

Należy zauważyć, że nie dotyczy to D; C++ gives you the same error.

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

Kompilacja z g ++ 4.3.4 daje:

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

Masz dwie opcje:

  1. uciec \ w ciąg tj "\\.bmp$".
  2. Użyj surowego pisuaru ciągów, tj. r"\.bmp$". Surowe ciągi literałów ignorują wszystkie sekwencje specjalne. Są zaprojektowane specjalnie dla takich rzeczy jak wzory regex.
+0

3. Użyj std.path.extension :) –

+0

Prawdopodobnie token "r" oznaczający surowy łańcuch oznacza "raw". Ale jest tak przydatny w tym kontekście, że zawsze myślę o nim jako "R, dla ciągów regex!" – CodexArcanum

+0

W D jest więcej opcji takich jak 6. Nie widzę potrzeby ich wymieniania, ponieważ wystarczy. –

Powiązane problemy