Mã của tôi:trận Zero-chiều dài trong Java Regex
Pattern pattern = Pattern.compile("a?");
Matcher matcher = pattern.matcher("ababa");
while(matcher.find()){
System.out.println(matcher.start()+"["+matcher.group()+"]"+matcher.end());
}
Output:
0[a]1
1[]1
2[a]3
3[]3
4[a]5
5[]5
Những gì tôi biết:
- "a" là viết tắt của số không hoặc một lần xuất hiện của ký tự 'a'.
Java API cho biết:
- matcher.start() trả về chỉ số bắt đầu của trận đấu trước đó.
- matcher.end() trả về giá trị bù trừ sau khi ký tự cuối cùng khớp với nhau.
- matcher.group() trả lại kết quả đầu vào khớp với kết quả trùng khớp trước đây . Đối với một m khớp với chuỗi đầu vào, các biểu thức m.group() và s.substring (m.start(), m.end()) là tương đương. Và đối với một số mẫu, ví dụ: *, khớp với chuỗi trống. Phương thức này sẽ trả về chuỗi trống khi mẫu khớp thành công chuỗi trống trong đầu vào.
Những gì tôi muốn biết:
- Trong đó tình huống nào engine regex gặp một số không xảy ra một nhân vật nhất định (s) - Dưới đây cho nhân vật 'a'.
- Trong trường hợp đó, giá trị thực sự trả về bằng phương thức start(), kết thúc() và nhóm() trong trình ghép. Tôi đã đề cập đến những gì java API nói. Nhưng tôi không rõ ràng khi nói đến tình hình thực tế như trên.
+1 đề cập đến các giải thích về hành vi lượng hóa tham lam của. Nhưng còn 5 [5] thì sao? Tại sao nó luôn thêm một sự xuất hiện 0 vào cuối mỗi chuỗi? – namalfernandolk
Hãy lấy một ví dụ đơn giản hơn với chuỗi "a". Động cơ bắt đầu bằng 0 và cố gắng khớp thành công 'a' -> để so khớp đầu tiên và di chuyển forwars đến vị trí 1 -> ở vị trí 1, nó sẽ thử kết quả trùng khớp 1 lần -> vì kết thúc chuỗi. Nó vẫn có thể làm cho một trận đấu 0-xuất hiện -> thành công. Sau đó nó di chuyển về phía trước -> cuối chuỗi -> kết thúc các trận đấu –
Thanx rất nhiều Guillaume. Nhưng sau khi kết hợp thành công cho 'a' Tại sao và làm thế nào nó di chuyển về phía trước. Không còn chỉ mục nữa; và không còn ký tự. Phải không? – namalfernandolk