2008-09-04 32 views
16

Tôi đang tìm một regex sẽ phù hợp với một chuỗi bắt đầu bằng một chuỗi con và không kết thúc bằng một chuỗi con nhất định.Regex để phù hợp với một cái gì đó không phải là một chuỗi con cụ thể

Ví dụ:

// Updated to be correct, thanks @Apocalisp 
^foo.*(?<!bar)$ 

nên phù hợp với bất cứ điều gì mà bắt đầu với "foo" và không kết thúc với "thanh". Tôi biết về cú pháp [^ ...], nhưng tôi không thể tìm thấy bất cứ điều gì sẽ làm điều đó cho một chuỗi thay vì các ký tự đơn.

Tôi đang cố gắng làm điều này cho regex của Java, nhưng tôi đã chạy vào điều này trước khi câu trả lời cho các công cụ regex khác cũng sẽ tuyệt vời.

Nhờ @Kibbee để xác minh rằng điều này cũng hoạt động trong C#.

+0

Như tôi đã đề cập dưới đây - regexp trong câu hỏi cho chuỗi đầu vào "foo123bar" nó sẽ phù hợp "foo12" - hy vọng đây là hành vi mong muốn. – Dmitry

Trả lời

9

Tôi nghĩ trong trường hợp này bạn muốn lookbehind tiêu cực, như vậy:

foo.*(?<!bar) 
1

Tôi không quen thuộc với regex Java nhưng tài liệu cho các Pattern Class sẽ đề nghị bạn có thể sử dụng (?! X) cho một không lookuring độ rộng tiêu cực lookahead (nó tìm cái gì đó không phải là X tại đó postision, mà không cần chụp nó như là một backreference). Vì vậy, bạn có thể làm:

foo.*(?!bar) // not correct 

Cập nhật: right Apocalisp, bạn muốn lookbehind tiêu cực. (bạn đang kiểm tra xem những gì. * kết quả khớp không kết thúc bằng thanh)

+0

Vấn đề với giải pháp này là trong thực tế là cho chuỗi đầu vào "foo123bar" nó sẽ phù hợp với "foo12" - hy vọng đây là hành vi mong muốn. – Dmitry

0

Như những người bình luận khác đã nói, bạn cần một cái nhìn tiêu cực. Trong Java bạn có thể sử dụng mô hình này:

"^first_string(?!.?second_string)\\z" 
  • ^- đảm bảo chuỗi bắt đầu với first_string
  • \ z - đảm bảo chuỗi kết thúc bằng second_string
  • - phương tiện (second_string?!.?) rằng first_string không thể được theo sau bởi second_string
1

đã kích hoạt @ Apocalisp của câu trả lời sử dụng:

import java.util.regex.Pattern; 
public class Test { 
    public static void main(String[] args) { 
    Pattern p = Pattern.compile("^foo.*(?<!bar)$"); 
    System.out.println(p.matcher("foobar").matches()); 
    System.out.println(p.matcher("fooBLAHbar").matches()); 
    System.out.println(p.matcher("1foo").matches()); 
    System.out.println(p.matcher("fooBLAH-ar").matches()); 
    System.out.println(p.matcher("foo").matches()); 
    System.out.println(p.matcher("foobaz").matches()); 
    } 
} 

sản lượng này là câu trả lời đúng:

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