Python regex khớp với giá trị khóa

Thông tin được tìm nạp bằng yêu cầu JSONP, yêu cầu này chứa văn bản quảng cáo và liên kết đến hình ảnh quảng cáo. Tệp JSON và hình ảnh được tìm nạp từ buysellads. com hoặc buysellads. net

Nếu bạn có bất kỳ câu hỏi hoặc thắc mắc nào, xin vui lòng gửi email

Mẹo này minh họa một giải pháp sử dụng Qt. Bản thân biểu thức chính quy có thể được sử dụng với bất kỳ công cụ biểu thức chính quy nào tương thích với PERL. Bạn có thể tìm thấy cuộc thảo luận giúp tôi viết Mẹo này tại Diễn đàn RegEx

Giới thiệu

Bạn nói, phân tích một cặp Khóa-Giá trị không khó lắm sao?

Key1=Value1 Key2=Value2

Nhưng nếu chúng ta tiến lên một chút thì sao?

Key1=Value 1 Key2=Value Key3=Value 3

Chúng tôi đến một nơi nào đó, như bạn có thể thấy. Nhưng tôi muốn nhiều hơn. Tôi muốn giá trị có thể chứa mọi thứ. Tất nhiên, điều này dẫn chúng ta đến một vấn đề, bởi vì '=' đã được dành riêng làm dấu phân cách giữa Khóa và Giá trị - Có thể giải quyết được bằng cách thoát dấu '=' nếu nó xảy ra trong một giá trị. Tôi đã tạo ra ví dụ thực tế này khi mẫu này có thể được sử dụng

ErrorMessage=The file was not found. Path\=C:/Temp/File.txt ErrorNumber=12312

Sử dụng biểu thức chính quy

Giải pháp được trình bày ở đây là khả thi trong mọi công cụ biểu thức chính quy tương thích với PERL, mặc dù tôi sẽ sử dụng Qt để chứng minh việc sử dụng nó. Regex trông khá mất tập trung nếu bạn nhìn vào nó lần đầu tiên

^[[\b[^\s=]+]=[[[^=]|\\=]+]]*$

Thoạt nhìn regex có vẻ lạ, nhưng ngay sau khi bạn đặt nó vào Expresso, bạn có thể thấy ý nghĩa của nó rõ ràng hơn

Về cơ bản, regex chứa hai nhóm chụp khác nhau, một nhóm là khóa [[\b[^\s=]+]] và nhóm còn lại là giá trị [[[[^=]. \\=]+]]. Hai lần chụp này phải được phân tách bằng dấu '='. Một khóa có thể chứa bất kỳ thứ gì ngoại trừ khoảng trắng hoặc '=' và một giá trị có thể chứa bất kỳ thứ gì ngoại trừ '=' không thoát. Mỗi chuỗi có thể xảy ra với bất kỳ số lần lặp lại nào

Bây giờ bạn đã biết về cơ bản regex làm gì, bạn cũng cần có khả năng phân tích cú pháp một chuỗi bằng cách sử dụng regex đã mô tả trước đó. Một cái gì đó quan trọng cũng vẫn còn để nói. Biểu thức chính quy được đề xuất chỉ trả về cặp Khóa-Giá trị cuối cùng, do đó chúng tôi cần xử lý chuỗi đầu vào nhiều lần

//Regular expression as descripted at 
// //www.codeproject.com/Tips752372/Parsing-a-Key-Value-pair-with-a-Regular-Expression
QRegularExpression regex["^[[\\b[^\\s=]+]=[[[^=]|\\\\=]+]]*$"];
QString example = "ErrorMessage=File wasn't found_Path\=C:/Temp/File.txt ErrorNumber=12312";
while[example.length[] > 0]{//As long there is stuff in example
   //Get the last Key-Value pair from the RegEx
   QRegularExpressionMatch keyValueRegexMatch = keyValueRegex.match[keyValueRawData]; 

   //Output the found Key-Value Pair
   qDebug[]

Chủ Đề