2015-09-20 15 views
5

Tôi muốn có một mô hình regex để tìm thấy bất kỳ số nguyên trong chuỗi, nhưng không nổi (với dấu thập phân là hay "" Vì vậy, cho chuỗi "":.regex: tìm số nguyên nhưng không nổi

abc111.222dfg333hfg44 0,55

nó chỉ nên tìm:

tôi tạo ra mô hình regex:

(?<!\\d[\\.,]|\\d)\\d+(?![\\.,]\\d+|\\d) 

nhưng nó không thành công khi sử dụng trong regex C++ STL. Nó ném ngoại lệ:

Unhandled exception at at 0x76AF4598 in xxxxxx.exe: Microsoft C++ exception: std::regex_error at memory location 0x00C1F218. 

nhưng nó hoạt động thoải mái tại lớp C# Regex

UPDATE:

Mã của tôi:

smatch intMatch; 
regex e1("(?<!\\d[\\.,]|\\d)\\d+(?![\\.,]\\d+|\\d)"); 
string s("111.222dfg333hfg44.55"); 
regex_search (s, intMatch, e1); 

nhưng nó ném ngoại lệ trên dòng:

regex e1("(?<!\\d[\\.,]|\\d)\\d+(?![\\.,]\\d+|\\d)"); 

CẬP NHẬT 2:

Cả hai câu trả lời đều đúng, nhưng đối với C++ STL regex Toto một hoạt động tốt hơn.

+1

Vấn đề gần như chắc chắn nằm trong mã của bạn, nhưng bạn chưa hiển thị bất kỳ mã nào, vì vậy không thể trả lời được. –

+0

Cú pháp biểu thức chính quy .NET khác với các biểu thức chính quy STL. – Dai

+1

Thành thật mà nói, đối với một vấn đề giống như những gì bạn mô tả, một trình phân tích cú pháp máy nhà nước "nhân vật ăn" đơn giản sẽ nhanh hơn để viết và dễ hiểu hơn, và cũng nhanh hơn trong thực thi. – Dai

Trả lời

3

Tôi không chắc chắn cho C++ STL, nhưng nhiều hương vị regex không hỗ trợ độ dài thay đổi tiêu cực lookbehind.

Trong trường hợp của bạn, bạn chỉ đơn giản có thể làm:.

(?:^|[^.,\d])(\d+)(?:[^.,\d]|$) 
+0

Giao diện phủ định của OP không phải là độ dài thay đổi –

+0

cảm ơn bạn đã trả lời nhưng mẫu của bạn không trả lại những gì tôi muốn.Đối với ví dụ từ câu hỏi của tôi, tìm thấy: "c111", "222d", "g333h", "g44", "55", được tạo từ "333" – user3057544

+0

@karthikmanchala: Có, nó đang cố gắng khớp một chữ số hoặc dấu chấm câu + một chữ số, vì vậy 1 hoặc 2 ký tự. – Toto

1

Như có thể có nhiều sự khác biệt trong hương vị regex được sử dụng bởi ngôn ngữ khác nhau/phiên bản/etc, tôi sẽ cố gắng xử lý vấn đề này với các chức năng regex cơ bản, được hỗ trợ bởi hầu hết các hương vị, như:

\d+[,.]\d+|(\d+) 

DEMO

Nó chỉ sử dụng thay thế và nhóm chụp, không lookarounds. Các số nguyên được ghi vào nhóm thứ nhất.

0

Thứ nhất, bạn cần biết rằng bên trong một nhóm ký tự như trong [] bạn không nên thoát khỏi siêu ký tự, vì vậy thay vì [\\.,] bạn phải viết [.,]. Tôi đã thử chương trình sau và dường như tìm đúng các kết quả phù hợp

std::string in = "abc111.222dfg333hfg44.55"; 

boost::regex re("(?<!(\\d[.,]|.\\d))\\d+(?![.,\\d])"); 

boost::sregex_iterator it(in.begin(), in.end(), re); 
boost::sregex_iterator end; 

for(;it!=end; ++it) 
{ 
    boost::smatch s = *it; 
    std::cout << s[0] << std::endl; 
} 
Các vấn đề liên quan