2013-05-31 38 views
7

Tôi đang tìm cách thay thế một giá trị chuỗi java như sau. mã dưới đây không hoạt động.Regex sử dụng Java String.replaceAll

 cleanInst.replaceAll("[<i>]", ""); 
     cleanInst.replaceAll("[</i>]", ""); 
     cleanInst.replaceAll("[//]", "/"); 
     cleanInst.replaceAll("[\bPhysics Dept.\b]", "Physics Department"); 
     cleanInst.replaceAll("[\b/n\b]", ";"); 
     cleanInst.replaceAll("[\bDEPT\b]", "The Department"); 
     cleanInst.replaceAll("[\bDEPT.\b]", "The Department"); 
     cleanInst.replaceAll("[\bThe Dept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bthe dept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bThe Dept\b]", "The Department"); 
     cleanInst.replaceAll("[\bthe dept\b]", "The Department"); 
     cleanInst.replaceAll("[\bDept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bdept.\b]", "The Department"); 
     cleanInst.replaceAll("[\bdept\b]", "The Department"); 

Cách dễ nhất để đạt được sự thay thế ở trên là gì?

+0

bạn có ý nghĩa gì khi không hoạt động? – stinepike

+0

Xóa các dấu ngoặc vuông ('[' và ']'). Đây là những lớp nhân vật. Nếu cái gì khác không hoạt động, bạn sẽ cần phải cụ thể hơn. – iamnotmaynard

+0

Bạn có biết những gì một lớp nhân vật trong một regex? http://regex.info – fge

Trả lời

6
cleanInst.replaceAll("[<i>]", ""); 

nên là:

cleanInst = cleanInst.replaceAll("[<i>]", ""); 

từ String lớp là không thay đổi và không thay đổi trạng thái nội bộ của mình, ví dụ: replaceAll() trả về một thể hiện mới đó là khác nhau từ cleanInst.

+2

Tôi nghĩ đây không phải là vấn đề ở đây ... – fge

+1

@fge ... nhưng nó là một trong số họ ... – iamnotmaynard

2

Bạn nên đọc cơ bản regular expressions tutorial.

Cho đến lúc đó, những gì bạn đã cố gắng để làm có thể được thực hiện như thế này:

cleanInst = cleanInst.replace("//", "/"); 
cleanInst = cleanInst.replaceAll("</?i>", ""); 
cleanInst = cleanInst.replaceAll("/n\\b", ";") 
cleanInst = cleanInst.replaceAll("\\bPhysics Dept\\.", "Physics Department"); 
cleanInst = cleanInst.replaceAll("(?i)\\b(?:the)?dept\\b\\.?", "The Department"); 

Bạn có thể có thể chuỗi tất cả những thay hoạt động (nhưng tôi không biết cú pháp Java thích hợp cho việc này).

Giới thiệu về word boundaries: \b thường chỉ có ý nghĩa trực tiếp trước hoặc sau ký tự chữ và số.

Ví dụ, \b/n\b sẽ chỉ phù hợp /n nếu nó trước trực tiếp bởi một nhân vật tự chữ và số và theo sau là một nhân vật phi tự chữ và số, vì vậy nó phù hợp với "a/n!" nhưng không "foo /n bar".

+1

+1 câu trả lời của bạn khá tốt, nhưng tại sao nhóm không chụp cho "the"? Nó chỉ là "hiệu suất"? Khả năng đọc IMHO của Cos giảm nhiều hơn hiệu suất tăng. Btw Tôi nghi ngờ '/ n' có nghĩa là' \ n' – Bohemian

+1

Tôi chỉ được sử dụng để làm như thế này. Tôi không bao giờ sử dụng dấu ngoặc đơn trừ khi tôi muốn chụp một nhóm. Tôi đồng ý rằng có sự căng thẳng giữa việc nêu rõ ý định của một người rõ ràng và dễ đọc. –

11

Nếu đó là chức năng liên tục bạn đang sử dụng, có sự cố. Mỗi biểu thức chính quy được biên dịch lại cho mỗi cuộc gọi. Tốt nhất là tạo chúng dưới dạng hằng số. Bạn có thể có một cái gì đó như thế này.

private static final Pattern[] patterns = { 
    Pattern.compile("</?i>"), 
    Pattern.compile("//"), 
    // Others 
}; 

private static final String[] replacements = { 
    "", 
    "/", 
    // Others 
}; 

public static String cleanString(String str) { 
    for (int i = 0; i < patterns.length; i++) { 
     str = patterns[i].matcher(str).replaceAll(replacements[i]); 
    } 
    return str; 
} 
+0

Thay vì 'Pattern', bây giờ chúng ta có các đối tượng' Matcher' được tạo ra mỗi lần. Làm thế nào là tốt hơn? – rpattabi

+0

Bởi vì việc biên dịch một mẫu regex tốn kém hơn việc tạo một Matcher cho một mẫu (được biên dịch trước)? –

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