2012-08-14 6 views
11

Tôi muốn khớp tất cả các dòng bắt đầu bằng một từ nhất định, nói iheap. Nếu tôi không nhầm lẫn biểu thức chính quy (theo cú pháp ECMAScript) "^iheap.*" nên thực hiện thủ thuật. Tuy nhiên, khi tôi thử nghiệm điều này trong C++ 11 bằng cách sử dụng thư viện regex của libC++, chỉ có dòng đầu tiên được khớp. Vì vậy, "^..." dường như chỉ khớp với phần đầu-đầu vào thay vì đầu-of-line.Kết hợp "đầu dòng" bằng cách sử dụng thư viện libC++ regex (C++ 11)

Dưới đây là một ví dụ:

#include <string> 
#include <regex> 
#include <iostream> 

using namespace std; 

int main() { 
     regex rx("^iheap.*"); 
     string s = "iheap says hello.\niheap says hello again.\n"; 
     cout << s << regex_replace(s, rx, "IHEAP"); 
     return 0; 
} 

Output:

iheap says hello. 
iheap says hello again. 
IHEAP 
iheap says hello again. 

Đây có phải là một lỗi của libC++ hay tôi làm điều gì sai? Cảm ơn!

Lưu ý: Tôi đang sử dụng Mac OS X Mountain Lion và Apple LLVM Compiler 4.0 (về cơ bản là ảnh chụp của clang 3.1 SVN).

+0

chỉ vấp ngã về vấn đề này ... fyi, boost :: regex (ở chế độ EMCAScript) khớp với đầu-of-line, tức là regex của bạn sẽ hoạt động. – fscan

+0

Hrmm, chỉ hơi liên quan, nhưng '$' không khớp với '\ r \ n' trong VS2013 - phải mất' \ s * $ 'hoặc tương tự để khớp ... – Cameron

Trả lời

5

Tôi đã xem xét tất cả các tiêu chuẩn có liên quan, và theo như tôi có thể biết,^chỉ khớp đầu chuỗi và không phải là dòng mới trừ khi động cơ ở chế độ đa phương thức. Động cơ mặc định là ECMA-262 Động cơ không ở chế độ nhiều dòng theo mặc định, và tôi không thấy cách nào để đặt nó vào chế độ nhiều dòng bằng giao diện std C++.

Tất cả những gì được nói, nếu ai đó có thể chỉ cho tôi về văn bản quy phạm khác nhau, tôi sẽ xem xét báo cáo lỗi này và cố hết sức để khắc phục.

+1

Chỉ cần cho một tiếng cười khúc khích, hãy thử điều này: '(? m)^iheap. *'. ECMA-262 không chỉ định các biến tố nội tuyến, nhưng 'libC++' có thể hỗ trợ chúng. Đây sẽ không phải là triển khai regex ECMAScript duy nhất để đơn phương thêm hỗ trợ cho các tính năng không được đề cập trong thông số kỹ thuật. –

+0

@AlanMoore: Chỉ cần thử nó, một ngoại lệ được ném. Thật không may có vẻ như họ không hỗ trợ phần mở rộng đó. – iheap

+2

Xin chào Howard. Tôi cũng không thể tìm thấy một văn bản quy phạm giải quyết câu hỏi, nhưng tôi nghĩ rằng tôi có một sự biện minh đủ mạnh để ngụ ý rằng chế độ mặc định phải là đa luồng. Có cờ 'std :: regex_constants :: match_not_bol' có chức năng đảm bảo rằng xác nhận' "^" 'không khớp với đầu của đầu vào. Với lá cờ đó ở chế độ nhiều dòng; xác nhận '"^"' sẽ khớp với tất cả các dòng trừ dòng đầu tiên. Trong chế độ một dòng, lá cờ đó sẽ làm cho xác nhận '"^"' không hoạt động, điều này không có ý nghĩa với tôi. – iheap