2008-11-10 29 views
32

Có thể bỏ qua một vài ký tự trong nhóm chụp trong cụm từ thông dụng không? Tôi đang sử dụng NET regexes nhưng điều đó không quan trọng.Cụm từ thông dụng để bỏ qua ký tự trong nhóm chụp

Về cơ bản, những gì tôi đang tìm kiếm là:

[text ngẫu nhiên] AB123 [text ngẫu nhiên]

và tôi cần phải nắm bắt 'AB123', mà không có gạch nối.

Tôi biết rằng AB có 2 hoặc 3 ký tự chữ hoa và 123 là 2 hoặc 3 chữ số, nhưng đó không phải là phần khó. Phần khó (ít nhất là đối với tôi) là bỏ qua dấu gạch nối.

Tôi đoán tôi có thể nắm bắt cả hai cách riêng biệt và sau đó ghép chúng vào mã, nhưng tôi muốn tôi có một giải pháp thanh lịch hơn, chỉ có regex.

Mọi đề xuất?

+0

trong javascript bạn có thể: /(AB)\-(123))/.exec("[random văn] AB-123 [ngẫu nhiên văn bản ] "); mảng trả về hiện tại của nó [1] và [2] ^^ – hanshenrik

+0

Điều gì về việc sử dụng lookahead tích cực (? =) và lookbehind tích cực (? <=)? Về cơ bản, điều này: (? <= \ ') ([A-Z] {2} - [0-9] {3}) (? = \') Sẽ hoạt động. –

Trả lời

41

Tóm lại: Bạn không thể. Một trận đấu luôn luôn liên tiếp, ngay cả khi nó chứa những thứ như xác nhận chiều rộng bằng không, không có cách nào xung quanh khớp với ký tự tiếp theo nếu bạn muốn nhận được kết quả sau đó.

+0

Bạn có thể sử dụng lookbehind tích cực và lookahead tích cực –

+2

True. Nhưng lookaround không * phù hợp với * bất cứ điều gì. Vị trí của động cơ regex vị trí trong sting không thay đổi. – Tomalak

15

Thực sự không phải là cách tạo biểu thức sao cho văn bản phù hợp khác với nội dung được tìm thấy trong văn bản nguồn. Bạn sẽ cần phải loại bỏ các gạch nối trong một bước riêng biệt hoặc bằng cách kết hợp những phần đầu tiên và thứ hai cá nhân và concatenating hai nhóm:

match = Regex.Match(text, "([A-B]{2,3})-([0-9]{2,3})"); 
matchedText = string.Format("{0}{1}", 
    match.Groups.Item(1).Value, 
    match.Groups.Item(2).Value); 

Hoặc bằng cách loại bỏ các gạch nối trong một bước tách biệt với quá trình kết hợp:

match = Regex.Match(text, "[A-B]{2,3}-[0-9]{2,3}"); 
matchedText = match.Value.Replace("-", ""); 
+2

Ngoài ra còn có 'match.Result (" $ 1 $ 2 ")' –

4

Xác nhận của bạn rằng không thể thực hiện mà không có nhóm phụ + đồng nhất nó là chính xác.

Bạn cũng có thể làm như Jeff-Hillman và chỉ loại bỏ các ký tự xấu sau khi thực tế.

Quan trọng cần lưu ý ở đây tho, là bạn "không sử dụng regex cho mọi thứ". Regex được thiết kế cho các giải pháp ít phức tạp hơn cho các vấn đề không tầm thường, và bạn không nên sử dụng "oh, chúng tôi sẽ sử dụng một regex" cho mọi thứ, và bạn sẽ không tham gia vào những ý nghĩ bạn có thể giải quyết vấn đề trong regex một bước.

Khi có một phương pháp tầm thường có thể hoạt động, bằng mọi cách, hãy sử dụng nó.

Ý tưởng thay thế, nếu bạn cần phải trả về nhiều kết quả phù hợp trong nội dung mã, hãy tìm regex "callback" dựa trên ngôn ngữ của bạn, cho phép chuyển bất kỳ nhóm phù hợp/tìm thấy nào vào cuộc gọi hàm thay thế dòng. (Đặc biệt là tiện dụng trong việc thay thế regexp).

Bạn không chắc chắn nó sẽ hoạt động như thế nào.Net, nhưng trong php bạn sẽ làm điều gì đó tương tự (không mã chính xác)

function strip_reverse($a) 
    { 
    $a = preg_replace("/-/", "", $a); 
    return reverse($a); 
    } 
    $b = preg_replace_callback("/(AB[-]?cde)/" , 'strip_reverse' , "Hello World AB-cde" ; 
+1

Nó là một sự hiểu lầm phổ biến mà regex là cho "siutations ít phức tạp" chỉ. Regex cực kỳ mạnh mẽ và giải quyết những thứ phức tạp thực sự. Regex không phải là công cụ phù hợp với những thứ không thường xuyên. Nó đơn giản: Có những thứ làm việc với regex, và có những thứ không có. – Tomalak

+0

có, nhưng theres một sung mãn/lạm dụng/regex trong các tình huống mà các giải pháp đang sử dụng một khẩu súng để giấy holepunch. nó sẽ hoạt động, nhưng có những biến chứng không tồn tại trong giải pháp đơn giản hơn. Điều quan trọng là biết khi nào * không * sử dụng regex;) –

+0

Biết khi nào nên sử dụng công cụ nào luôn là chìa khóa. Tôi có lẽ sẽ tránh sử dụng regex trong một vòng lặp dài khi có một cách khác (nói, "indexOf" cộng với một toán học nhỏ). – Tomalak

1

Bạn có thể sử dụng các nhóm chụp lồng nhau, như thế này:

((AB)-(123)) 

Nhóm chụp đầu tiên là AB-123, thứ hai là AB và thứ ba là 123. Sau đó, tất cả các bạn sẽ phải làm là tham gia nhóm thứ hai và thứ ba với một không gian.

+0

OP cho biết ông đã biết về tùy chọn đó. Anh ta chỉ nghĩ rằng nên có một cách duyên dáng hơn. –

0

Loại muộn, nhưng tôi nghĩ tôi đã tìm ra điều này. Ít nhất một cách để làm điều đó.

Tôi đã sử dụng lookahead tích cực để dừng tại dấu # trong văn bản của mình. Tôi không muốn không gian hoặc ký hiệu #, vì vậy tôi phải tìm ra cách để "bỏ qua" chúng. Vì vậy, khi tôi bị buộc phải kết hợp chúng lại, tôi đổ chúng vào một nhóm rác mà tôi không có kế hoạch sử dụng (.ie, một xô nhỏ) mà trong mã là. Bây giờ, con trỏ vị trí của tôi là một vị trí ký tự ngoài dấu # (nơi tôi muốn, bỏ qua dấu cách và dấu #). Và bây giờ tôi chỉ phù hợp với phần cuối của tên tập tin tại. và bỏ qua phần mở rộng của tệp.

(?i)English\\(?<Series>[^ ]+) - (?<Title>.+(?= #))(?<garb1>..)(?<Number>[^.]+)(?-i) 

tên tập tin này được sử dụng trên là

F:\Downloads\Downloads\500 Comics CCC CBR English\Isukani - Great Girl #01.cbr 
Các vấn đề liên quan