2010-10-05 33 views
11

Tôi cần xóa tất cả các ký tự khỏi chuỗi đã cho trừ một số ký tự còn lại. Làm thế nào để làm điều đó với regexp?Có toán tử không (!) Trong regexp không?

Thử nghiệm đơn giản: ký tự [1, a, *] không nên bị xóa, tất cả các chuỗi khác phải từ chuỗi "asdf123 **".

Trả lời

22

Có:^trong bộ.

Bạn sẽ có thể làm điều gì đó như:

text = text.replaceAll("[^1a*]", ""); 

Full mẫu:

public class Test 
{ 
    public static void main(String[] args) 
    { 
     String input = "asdf123**"; 
     String output = input.replaceAll("[^1a*]", ""); 
     System.out.println(output); // Prints a1** 
    } 
} 
+2

Bạn không cần phải thoát khỏi '*' trong một lớp nhân vật. – kennytm

+1

@KennyTM: Ooh, tôi không biết điều đó. Chúc mừng, điều chỉnh ngay bây giờ ... –

+0

Bạn cũng không cần phải thoát khỏi dấu nối nếu nó ở cuối hoặc bắt đầu của một lớp nhân vật. Vì vậy, [^ * .-] đại diện cho mọi thứ không phải là dấu hoa thị, dấu chấm hoặc dấu gạch nối. :) –

9

Khi được sử dụng bên trong []^ (dấu mũ) là toán tử not.

Nó được sử dụng như thế này:

"[^abc]" 

Điều đó sẽ phù hợp với bất kỳ ký tự trừ ab hoặc c.

+3

Khi được sử dụng * làm ký tự đầu tiên * bên trong ... –

1

Có từ chối character class, có thể hoạt động cho trường hợp này. Bạn xác định một bằng cách đặt ^ vào đầu của lớp, chẳng hạn như:

[^1a\*]

đối với trường hợp cụ thể của bạn.

+0

bạn cần thoát *, phải là \\ * – Cfreak

+0

Thực ra bạn không (trong phương ngữ regex mà tôi biết, dù sao), nhưng bạn có thể. Tôi sẽ thêm nó để được rõ ràng, mặc dù. – eldarerathis

+0

@Cfreak: không bạn không (xem ở trên) –

0

Trong một lớp nhân vật^thì không. Vì vậy,

[^1a\*] sẽ khớp với tất cả các ký tự ngoại trừ những ký tự đó.

0

Bạn muốn để phù hợp chống lại tất cả các nhân vật ngoại trừ: [asdf123 *], sử dụng^

0

Không có "không phải là" nhà điều hành trong biểu thức thông thường Java như có trong Perl.

+0

Bạn đang nói về toán tử đối xứng regex đảo ngược của Perl '! ~'? Điều đó không thực sự có liên quan, cho rằng OP đang làm một sự thay thế, không phải là một trận đấu. Và nếu anh * cố gắng để phù hợp với các nhân vật hơn là thay thế chúng, anh ta sẽ cần phải thực hiện một trận đấu * dương * cho một regex không bao gồm những nhân vật đó, như những người phản ứng khác đã chỉ ra. Ví dụ, trong Perl anh ta có thể làm điều này: 'my @result = $ s = ~ m/[^ 1a *] +/g;' –

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