2010-04-09 27 views
5

Tôi có regex này:thay thế nhân vật mà không phù hợp với những người thân trong một regex

private static final String SPACE_PATH_REGEX ="[a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 

tôi kiểm tra xem chuỗi của tôi phù hợp với regex này và nếu không, tôi muốn thay thế tất cả các nhân vật mà không phải là ở đây, với "_".

Tôi đã thử như:

private static final String SPACE_PATH_REGEX_EXCLUDE = 
     "[~a-z|A-Z|0-9|\\/|\\-|\\_|\\+]+"; 
if (myCompanyName.matches(SPACE_PATH_REGEX)) { 
    myNewCompanySpaceName = myCompanyName; 
} else{ 
    myNewCompanySpaceName = myCompanyName.replaceAll(
      SPACE_PATH_REGEX_EXCLUDE, "_"); 
} 

nhưng nó không hoạt động ..., vì vậy trong regex thứ 2 "~" dường như không bỏ qua các ký tự sau đây.

Bất kỳ ý tưởng nào?

Trả lời

8

Bạn có một vài vấn đề trong regex của bạn (xem Pattern class cho các quy tắc):

  • bên trong một lớp nhân vật | không có ý nghĩa đặc biệt và cần được loại bỏ mà không cần thay thế trong trường hợp của bạn (trừ khi bạn muốn nhân vật của bạn lớp học để bao gồm các ký tự chữ số |).
  • Tương tự, bạn không cần phải thoát khỏi các số /, _+ bên trong một lớp ký tự.
  • - chỉ cần được thoát nếu nó không phải là ký tự cuối cùng
  • ~ cũng không có ý nghĩa đặc biệt trong một lớp nhân vật nó chỉ đại diện cho bản thân
  • bạn sẽ muốn sử dụng ^ phủ nhận nội dung của một nhóm nhân vật.

Bạn cũng có thể bỏ qua kiểm tra đầu tiên matches(), vì cuộc gọi replaceAll() sẽ trả lại một Chuỗi chưa sửa đổi nếu không có gì phù hợp. Việc giữ nó (và biểu thức chính quy thứ hai) chỉ phục vụ để giới thiệu một nơi khác mà các lỗi có thể ẩn (ví dụ bạn có thể vô tình cập nhật một regex, nhưng không thể cập nhật một regex khác).

+0

Cảm ơn rất nhiều vì đã giải thích rõ ràng. –

4

Hãy thử:

final String SPACE_PATH_REGEX_EXCLUDE = "[^\\w~/\\-+]"; 
String out = in.replaceAll(SPACE_PATH_REGEX_EXCLUDE, "_"); 

Vấn đề chính bạn phải là bạn đang đặt không cần thiết | s vào mô hình của bạn. Chúng có ý nghĩa khác. Ngoài ra, bạn có thể đơn giản hóa biểu thức của mình bằng cách sử dụng \w, có nghĩa là "ký tự từ", có nghĩa là chữ cái (chữ hoa hoặc chữ thường), chữ số hoặc dấu gạch dưới và đồng nghĩa với [A-Za-z0-9_].

Ngoài ra, bạn cần phải hiểu cách thoát hoạt động. Có thoát chuỗi Java, đó là lý do tại sao bạn đặt trong \\ để đặt một dấu gạch chéo ngược vào mẫu. Nhưng có regex thoát quá. Ví dụ: \n là một ký tự dòng mới của chuỗi Java và \\n là chuỗi để đặt \n vào một mẫu để tìm ký tự dòng mới.

Bạn có hai lựa chọn thuận tiện cho việc thoát một loạt các văn bản:

  1. Bạn có thể sử dụng \Q...\E.Mọi thứ giữa \Q\E được thoát; và

  2. Bạn có thể sử dụng Pattern.quote() để trích dẫn một chuỗi tùy ý.

Nơi bạn cần thoát khỏi các chuỗi nhất định trong regex là ngữ cảnh. Ví dụ: - chỉ cần được thoát nếu nó có thể bị nhầm lẫn khi chỉ ra một phạm vi. [a-z] là ký tự chữ thường. [a\-z] là một trong số a, - hoặc z. Nhưng bạn có thể làm -[a-z] để chỉ ra dấu gạch ngang theo sau là chữ thường. Lưu ý: bạn không cần phải thoát khỏi dấu nối đầu tiên.

+0

Tôi nghĩ bạn cần phải thoát khỏi '-' –

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