2012-01-11 38 views
8

Tôi không chắc chắn rằng các regex là giải pháp tốt nhất ở đây, nhưng chúng dường như đủ logic; Tôi chỉ không chắc chắn làm thế nào để thực sự thực hiện điều này.Thực tiễn tốt nhất: So khớp một phần Regex

Về cơ bản, tôi muốn người dùng của mình có thể nhập tên phương thức và yêu cầu phân tích cú pháp để hợp lệ sau mỗi lần nhập ký tự. Tôi đã xác định một định dạng chức năng hợp lệ như một regex, và nó rất dễ dàng, đủ để kiểm tra nếu hai trận đấu. Vấn đề là, tôi muốn có thể làm một phần phù hợp, để cho người dùng biết, "Cho đến nay, điều này là hợp lệ".

Ví dụ,

+(NSString *)thisIsAValid:(ObjectiveC *)method; 

là một phương pháp hợp lệ. Nó có thể được kết hợp bằng một chuỗi regex đơn giản như

[\+-]\(w+\s*\*?\)\w+....etc... 

. Nhưng tôi rất thích có thể có cùng chuỗi regex đó "khớp"

+(NSStr 

(mà tôi nhận thấy là một cách ngược lại khi sử dụng regex). Tôi vẫn không muốn regex khớp với

Q)(NStr 

Có cách nào để thực hiện điều gì đó như thế này với chức năng regex chuẩn hay tôi phải làm điều gì đó quyết liệt hơn?

Cảm ơn bạn rất nhiều! Các bạn là vô giá.


Sau khi suy nghĩ thêm, tôi cho rằng tôi có thể làm cho câu hỏi của tôi một chút rõ ràng (cũng như gọn gàng hơn một chút): Thông thường, người ta sử dụng một regex để tìm kiếm một mô hình trong văn bản. Tức là, "mèo" hay "cũi" xuất hiện bao nhiêu lần trong đoạn này. Tôi muốn làm điều ngược lại, tìm kiếm một chuỗi "trong" một regex. Đó là, bao nhiêu chuỗi này, bắt đầu từ đầu phù hợp với regex này. Cuối cùng, tôi muốn trả về chỉ mục mà chuỗi không còn khớp với regex được đề cập.

+0

Nó có vẻ như mục tiêu thực sự của bạn là phải có một regex cho một mô hình đó là * chắc chắn không hợp lệ *, và sau đó để kích hoạt một lỗi khi mô hình đó là lần xuất hiện. Vì vậy, bạn có thể muốn xem xét phù hợp với sự bổ sung của ngôn ngữ. Lưu ý rằng bổ sung của một ngôn ngữ thông thường có thể hoặc có thể không được thường xuyên! –

+0

Cùng với những dòng này, tôi khuyên bạn nên tìm một mô tả tốt về ngữ pháp Mục tiêu-C (có thể là ngữ pháp không có bối cảnh) và xem bạn có thể so sánh được bao nhiêu với quy tắc khai báo phương thức với regex. –

+0

+1 cho một câu hỏi thú vị!:-) –

Trả lời

1

Các đường nối RegexKit sử dụng PCRE để bạn có thể sử dụng PCRE trực tiếp.

#include <stdio.h> 
#include <pcre.h> 

void test_match(pcre *re, char *subject); 

void test_match(pcre *re, char *subject) { 
    int rc = pcre_exec(re, NULL, subject, (int)strlen(subject), 
        0, PCRE_PARTIAL, NULL, 0); 
    printf("%s: %s\n", subject, 
     rc == 0 || rc == PCRE_ERROR_PARTIAL ? 
     "match or partial" : "no match"); 
} 

int main (int argc, const char * argv[]) { 
    pcre *re; 
    const char *errstr; 
    int erroffset; 

    re = pcre_compile("^ABC$", 0, &errstr, &erroffset, NULL); 
    test_match(re, "A"); 
    test_match(re, "AB"); 
    test_match(re, "ABC"); 
    test_match(re, "ABD"); 

    return 0; 
} 

Sẽ in:

A: match or partial 
AB: match or partial 
ABC: match or partial 
ABD: no match 
0

Tôi chỉ muốn viết một kịch bản để có những regex và chia nó lên để các regex ABCD trở thành regex mới: ^ (ABCD | ABC | AB | A) $

ngoặc sẽ được khôn lanh để tránh chúng nếu có thể. Nếu không, bạn phải tính đến điều đó có thể bằng cách thêm đúng số lượng parens đóng. Ngoài ra, bạn sẽ phải mã hóa chuỗi ABCD bằng toán tử regex, do đó bạn không chia nhỏ thứ gì đó như \ * +

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