2012-04-14 26 views
5

Tôi mới sử dụng mã hóa Android, nhưng tôi có kinh nghiệm với Perex regex. tôi cần phải phù hợp với một danh sách từ 0 hoặc nhiều định danh với một biểu thức chính quy như:Tham chiếu đến các nhóm phù hợp trước đó trong một regex

^\s*((\w\d\d\d)(\s+$2)*)?$ 

Note $ 2 đề cập đến nhóm phù hợp trước đó (\ w \ d \ d \ d) Đối với mã android nó sẽ trông giống như:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\$2)*)?$") 

biên dịch Eclipse không biên dịch \ $ 2, tôi cũng \ 2 cố gắng, mà biên dịch nhưng cố gắng để phù hợp với một số chữ 2.

giải pháp brute force sẽ được lặp lại các định danh mẫu:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+(\\w\\d\\d\\d))*)?$") 

Nó hoạt động, nhưng nó có những nhược điểm sau: * Nó rất dễ dàng để thực hiện một lỗi cú pháp trong hoặc lặp lại * như nhận diện phức tạp hơn chuỗi được lớn * nó không phải là thanh lịch * trở nên phức tạp hơn nhiều nếu bạn cần tham khảo không một nhưng một số kết quả phù hợp trước đó là

Có cách nào trong Java để chỉ các nhóm phù hợp trước đó trong regex không?

+0

bạn đã thử 'Pattern.compile ("^\\ s * ((\\ w \\ d \\ d \\ d) (\\ s + \\ 2) *)? $ ")' Tôi nghĩ phản hồi là \ N trong đó N là nhóm của bạn. Mặc dù bạn phải gạch chéo ngược dấu gạch chéo ngược với '\\ N' –

+0

Có, tôi có, nó sẽ lấy \\ 2 như một chữ số 2 (tôi quên để tăng gấp đôi dấu gạch chéo ngược trong bài gốc, nhưng đây là những gì tôi có nghĩa là). – ilomambo

Trả lời

0

Tôi xin lỗi về sự nhầm lẫn, hoang mang của tôi. Regex:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$") 

sẽ khớp với thứ gì đó như "A12 A12", do đó khớp với kết quả phù hợp trước đó. (Tôi vừa thử nó trên Eclipse và theo sau nó với trình gỡ rối)

Điều tôi muốn là cách viết một regex ngắn cho chuỗi như "A12 B35 C36 A011" Trong perl bạn có thể sử dụng các biến một phần của mẫu, do đó, nó có thể được thực hiện trong perl:

$a='\w\d\d\d'; 
$mystring =~ /^\s*(($a(\s+$a)*)?$/; 

Ngắn và đơn giản. Vì vậy tôi giả định trong java nó cũng có thể được thực hiện bằng cách nối chuỗi (tôi chỉ cần thử nó và nó hoạt động)

String id="\\w\\d\\d\\d"; 
Pattern.compile("^\\s*(" + id + "(\\s+" + id + ")*)?$"); 

Nó không phải là thanh lịch, nhưng nó thực hiện công việc.

+1

Nói chung, hầu hết các ngôn ngữ xử lý đầu vào cho trình biên dịch biểu thức chính quy dưới dạng _string_. Perl là một ngoại lệ: regexen được đưa vào ngôn ngữ một cách triệt để đến mức chúng thực sự là một phần của chương trình. – katrielalex

0

Hãy nhớ rằng không chỉ $ cần phải được thoát, nhưng bản thân \ cần phải được thoát!

Vì vậy, bạn cần:

Pattern.compile("^\\s*((\\w\\d\\d\\d)(\\s+\\$2)*)?$") 
+0

Tôi đã nhầm lẫn, tôi thấy có gì sai với regex của tôi. Tôi sẽ có thể đăng câu trả lời trong 7 giờ (hạn chế người mới) – ilomambo

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