Lý do mà bạn không nhận được một tùy chọn cat
sau một miễn cưỡng có trình độ .+?
là nó là cả hai tùy chọn và không neo: động cơ không buộc phải làm cho trận đấu đó, bởi vì nó có thể điều trị một cách hợp pháp cat
là "đuôi" của chuỗi .+?
.
Nếu yo neo mèo ở phần cuối của chuỗi, tức là sử dụng ^(dog).+?(cat)?$
, bạn sẽ nhận được một trận đấu, mặc dù:
Pattern p = Pattern.compile("^(dog).+?(cat)?$");
for (String s : new String[] {"dog, cat", "dog, dog, cat", "dog, dog, dog"}) {
Matcher m = p.matcher(s);
if (m.find()) {
System.out.println(m.group(1)+" "+m.group(2));
}
}
in này (demo 1)
dog cat
dog cat
dog null
Đỗ bạn xảy ra để biết làm thế nào để đối phó với nó trong trường hợp có cái gì đó sau khi con mèo?
Bạn có thể đối phó với nó bằng cách xây dựng một biểu thức phức tạp hơn phù hợp với bất cứ điều gì ngoại trừ cat
, như thế này:
^(dog)(?:[^c]|c[^a]|ca[^t])+(cat)?
Bây giờ cat
có thể xảy ra bất cứ nơi nào trong chuỗi mà không có một neo (demo 2).
Cảm ơn. Bạn có biết làm thế nào để đối phó với nó trong trường hợp có cái gì đó sau khi con mèo? Ví dụ: "chó, chó, mèo, blah'. Tôi chỉ muốn bắt con chó đầu tiên và mèo tùy chọn (có thể có tối đa một con mèo). – forsajt
rất muốn xem câu trả lời này –