2015-04-30 15 views
5

Tôi đang sử dụng removeNumbers để loại bỏ tất cả các số trong một chuỗi cho trước với regex
"(^|)\\d+($|(\\d+)+($|)|)"Regex để tìm số trong một chuỗi

Dưới đây là các mã:

public class Regex {  
    private static String removeNumbers(String s) { 
    s = s.trim(); 
    s = s.replaceAll(" +", " "); 
    s = s.replaceAll("(^|)\\d+($|(\\d+)+($|)|)", " "); 
    return s.trim(); 
    } 

    public static void main(String[] args) { 
    String[] tests = new String[] {"123", "123 456 stack 789", "123 456 789 101112 131415 161718 192021", "stack 123 456 overflow 789 com", "stack 123 456 overflow 789", "123stack 456", "123 stack456overflow", "123 stack456", "123! @456#567"}; 
    for (int i = 0; i < tests.length; i++) { 
     String test = tests[i]; 
     System.out.println("\"" + test + "\" => \"" + removeNumbers(test) + "\""); 
    } 
    }  
} 

Output:

"123" => "" 
" 123 " => "" 
"123 456 stack 789" => "stack" 
"123 456 789 101112 131415 161718 192021" => "" 
"stack 123 456 overflow 789 com" => "stack overflow com" 
"stack 123 456 overflow 789" => "stack overflow" 
"123stack 456" => "123stack" 
"123 stack456overflow" => "stack456overflow" 
"123 stack456" => "stack456" 
"123! @456#567" => "123! @456#567" 

Có cách nào tốt hơn để thực hiện việc này không?

Sửa:

Theo đề nghị của @ mbomb007 trong câu trả lời trước đây của ông, regex "(|^)[\\d ]+(|$)" làm việc cũng như:

private static String removeNumbers(String s) { 
    s = s.trim(); 
    s = s.replaceAll(" +", " "); 
    s = s.replaceAll("(|^)[\\d ]+(|$)", " "); 
    return s.trim(); 
} 
+0

Câu trả lời của tôi sai, nhưng bây giờ tôi đã sửa nó. Tôi đã đăng liên kết tới phiên bản web chạy regex dựa vào các trường hợp kiểm tra của bạn. – mbomb007

+0

Sản lượng của bạn có chính xác không? Nếu có và bạn đang tìm cách viết lại mã của mình tốt hơn có vẻ như câu hỏi của bạn sẽ được hỏi trên http://codereview.stackexchange.com/. – Pshemo

+0

Chuỗi có thể bắt đầu hoặc kết thúc bằng dấu cách không? – Pshemo

Trả lời

3

AFAIU, bạn chỉ có thể làm:

private static String removeNumbers(String s) { 
    return s.replaceAll("\\b\\d+\\b", "").replaceAll(" +", " ").trim(); 
} 

\b\d+\b khớp với một hoặc nhiều chữ số tạo thành một từ.

EDIT:

Kể từ khi mô hình không phải phù hợp với số trong một chuỗi như "123! @456#567", một sự kết hợp của lookbehind và lookahead điều kiện tích cực có thể được sử dụng:

private static String removeNumbers(String s) { 
    return s.replaceAll("(?<= |^)\\d+(?= |$)", " ").replaceAll(" +", " ").trim(); 
} 
+2

Hoặc tất cả trên một dòng 'return s.replaceAll (" \\ d "," ") .replaceAll (" + "," ") .trim();' – ChrisStillwell

+0

Điều này không hoạt động cho ví dụ của mình: '" 123 stack456overflow "=>" stack456overflow "' – mbomb007

+0

Tôi đã thêm một trường hợp thử nghiệm khác: '" 123! @ 456 # 567 "=>" 123! @ 456 # 567' –

0

Bạn cũng có thể làm điều đó với thư viện ổi:

String text = "stack 123 456 overflow 789 com"; 
String theLettersWithLargeSpaces = CharMatcher.JAVA_LETTER.or(CharMatcher.WHITESPACE).retainFrom(text); 
theLetters = CharMatcher.WHITESPACE.collapseFrom(theLettersWithLargeSpaces , ' '); 
System.out.println(theLetters); 

Tôi giả định rằng không chỉ các chữ số có thể xảy ra mà còn cả các chữ số khác nhân vật phản diện. Đầu ra sẽ là: "stack overflow com"

CharMatcher là công cụ rất mạnh. Tôi nghĩ rằng nó dễ đọc hơn nhiều so với regex.

Nếu bạn muốn chỉ là một chức năng:

public String clearUnwantedChars(String text) { 
     return CharMatcher.WHITESPACE.collapseFrom(CharMatcher.JAVA_LETTER.or(CharMatcher.WHITESPACE) 
      .retainFrom(text), ' '); 
} 
2

regex của bạn là một chút dư thừa (và cũng không hoàn toàn phù hợp với trường hợp thử nghiệm của bạn). Bạn có thể sử dụng này:

"\\b[ ]*(?<![^\\d\\s])[\\d]+(?![^\\d\\s])[ ]*\\b" 

tự thoát \b đại diện cho một biên giới từ (bắt đầu hoặc kết thúc của một từ). Tôi cũng sử dụng [ ]* để đảm bảo khoảng cách giữa các số bị xóa. Regex này cũng cho phép các từ chứa các số mà không bị thay thế. Cũng giống như bạn muốn.

EDIT: Tôi đã thêm một lookbehind phủ định và một lookahead tích cực.

(?<![^\\d\\s]) - Điều này đảm bảo rằng các ký tự ngay trước chữ số chỉ có nhiều chữ số hoặc dấu cách.

(?![^\\d\\s]) - Điều này đảm bảo rằng các ký tự ngay sau các chữ số chỉ có nhiều chữ số hoặc dấu cách.

Try it here với các trường hợp thử nghiệm của bạn. (Cập nhật siêu liên kết cho trường hợp thử nghiệm được thêm)

+0

Tôi đã thêm một trường hợp thử nghiệm khác: '" 123 ! @ 456 # 567 "=>" 123! @ 456 # 567' –

+0

@BharatKhatri Tôi đã thay đổi nó cho trường hợp thử nghiệm được thêm vào và cập nhật siêu liên kết đến ví dụ mới. Tôi hy vọng bạn tìm thấy nó hữu ích. – mbomb007

+0

Một trong những cách tiếp cận trước đó của bạn bằng cách sử dụng '" (| ^) [\\ d] + (| $) "' hoạt động tốt. Tôi đã thêm nó vào bản chỉnh sửa cho câu hỏi, vì bạn đã cập nhật câu trả lời của mình và cách tiếp cận trước đó không còn hiển thị nữa. –

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