2011-12-31 35 views
6

Điều này nghe có vẻ giống như một câu hỏi ngớ ngẩn nhưng trong D (sử dụng std.regex) làm thế nào để bạn khớp một dấu chấm trong một chuỗi?Trong D sử dụng thư viện std.regex, bạn làm cách nào để khớp một dấu chấm?

Sử dụng mã này tôi đang kiểm tra phần mở rộng tệp .bmp vì vậy tôi thực hiện kết hợp regex đơn giản trên đó. Nếu tôi cố gắng và thoát khỏi dấu chấm như thế này tôi nhận được một lỗi.

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

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

Error: Undefined escape sequence \.

Ngay cả trong documentation nó không đề cập phù hợp với dấu chấm.

Bất kỳ ý tưởng nào?

+0

Là đặc biệt '$' trong D? – fge

+0

@fge Đó là một cách tiêu chuẩn phù hợp với kết thúc của một chuỗi (hoặc dòng trong chế độ nhiều dòng). –

+0

Tôi biết điều đó. Tôi chỉ băn khoăn liệu D _language_ có yêu cầu thoát nó bằng cách nào đó, để nó có nghĩa đen trong chuỗi (và do đó '$' trong một regex) – fge

Trả lời

8

Tôi đoán bạn cần phải thoát kép (Bạn muốn \. trong regex). Trong mã hiện tại của bạn, bạn đang thoát khỏi nó, vì vậy D cố gắng giải thích nó như là một cái gì đó cho chính nó, không phải cho regex. Thoát kép cho D biết rằng bạn muốn có một số \ bằng chữ trong chuỗi.

Vì vậy, cuối cùng, nó sẽ trông giống như "\\.bmp$".

+0

+1. Nó có thể hữu ích để được rõ ràng về thoát kép: "\\. Bmp $" – orip

+0

Điều này không hoạt động. Tôi đã tăng gấp đôi thoát nó và tất cả các công trình tốt, cảm ơn! –

10

"\.bmp$" chuỗi của bạn được tự thoát, do đó lỗi. D nghĩ rằng bạn đang cố gắng để thoát khỏi . trong chuỗi, nhưng \. không phải là một chuỗi thoát hợp lệ.

Lưu ý rằng điều này không cụ thể đối với D; C++ gives you the same error.

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

Biên soạn với g ++ 4.3.4 cho:

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

Bạn có hai lựa chọn:

  1. Thoát khỏi \ trong chuỗi của bạn ví dụ: "\\.bmp$".
  2. Sử dụng trình viết chữ bằng chuỗi thô, nghĩa là r"\.bmp$". Các chuỗi ký tự chuỗi thô bỏ qua tất cả các chuỗi thoát. Chúng được thiết kế đặc biệt cho những thứ như các mẫu regex.
+0

3. Sử dụng std.path.extension :) –

+0

Có lẽ mã thông báo 'r' để gắn cờ một chuỗi thô là viết tắt của "thô". Nhưng nó rất hữu ích trong bối cảnh này mà tôi luôn luôn nghĩ về nó là "R, cho chuỗi regex!" – CodexArcanum

+0

Có thực sự giống như 6 lựa chọn trong D. Tôi thấy không cần phải liệt kê chúng như bạn là đủ. –

Các vấn đề liên quan