2012-03-17 39 views
5

Tôi muốn chia các chuỗi ở dạng EADGBE hoặc DADF # AD thành các chuỗi riêng biệt, mỗi chuỗi chứa một chữ cái hoặc một chữ cái cộng với dấu #. Có cách nào thanh lịch hơn so với lặp qua chuỗi với một cách tiếp cận vũ phu?Cách tốt để tách chuỗi không phân tách bằng Java là gì?

String.split rõ ràng dựa vào dấu phân cách, sau đó bị loại bỏ, không được sử dụng nhiều cho tôi chút nào - trong một vài phút tôi nghĩ split("[a-gA-G]#?"); sẽ hoạt động, nhưng không, điều đó không giúp ích gì tất cả - tôi gần như muốn đối diện với điều đó ...

+0

Bạn có thể đưa ra một ví dụ về chuỗi ký tự mà bạn muốn chia không? – chandsie

+0

Tôi e rằng bạn sẽ phải đi theo phương pháp brute-force – mac

+0

Điều này là tầm thường. Đi cho lực lượng vũ phu. Không thêm độ phức tạp và tổng quan về một regex. –

Trả lời

3

Lực lượng vũ phu có thể là lựa chọn tốt nhất của bạn, cả về mã và hiệu suất.

Ngoài ra, bạn có thể sử dụng một Matcher

Pattern p = Pattern.compile("[a-gA-G]#?"); 
Matcher m = p.march(inputString); 
List<String> matches = new ArrayList<String>(); 
while(m.find()) 
    matches.add(m.group()); 
+0

Ah, rất đẹp - không có googling của tôi bật lên bất cứ điều gì về Matchers! Cảm ơn vì điều đó. :) – Oolong

1

Nếu bạn forsee thay đổi trong mô hình bạn có thể sử dụng:

String s = "DADF#AD"; 
    Pattern p = Pattern.compile("([a-gA-G]#?)"); 
    Matcher matcher = p.matcher(s); 
    while (matcher.find()) { 
     System.out.println(matcher.group()); 
    } 
1

Sử dụng lookahead và lookbehind hoạt động: String regex = "(?<=.)(?=\\w#?)";

ví dụ:

import java.util.Arrays; 

public class Foo { 
    public static void main(String[] args) { 
     String[] tests = {"EADGBE", "DADF#AD"}; 
     String regex = "(?<=.)(?=\\w#?)"; 
     for (String test : tests) { 
     System.out.println(Arrays.toString(test.split(regex))); 
     } 
    } 
} 

lợi nhuận:

[E, A, D, G, B, E]
[D, A, D, F #, A, D]

+0

'Chuỗi regex =" (? = (?! ^) \\ w #?) ";', Có bạn đi. –

+0

@refp: có vẻ hoạt động tốt - ngăn không cho bắt đầu dòng bắt đầu. Slick và cảm ơn! –

+0

Ah ... Tôi không biết đó là một lựa chọn! Có lẽ không phải là kỹ thuật thân thiện với con người nhất - hoặc có lẽ tôi thực sự có ý nghĩa thân thiện với người mới - nhưng chắc chắn là tốt khi biết rằng đây là điều bạn có thể làm với regexps trong Java. Cảm ơn bạn! – Oolong

0

Làm thế nào về điều đó: thêm delimiters, sau đó phân chia:

phương pháp này cho biết thêm delimiters

private static String delimit(String in) { 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < in.length()-1; i++) { 
    sb.append(in.charAt(i)); 
    if (in.charAt(i+1) != '#') 
     sb.append(';'); 
    } 
    return sb.toString(); 
} 

Để sử dụng nó:

String[] notes = delimit("DADF#AD").split(";"); 
+0

Tại sao không sử dụng vòng lặp for để tạo danh sách mã thông báo thay vì xây dựng một chuỗi trung gian không cần thiết? – Dunes

+0

@ Dunes Tôi đã đăng hàng chục giải pháp chuẩn trên SO - chỉ muốn làm điều gì đó khác biệt;) –

+0

heh! Tôi đoán điều đó sẽ có hiệu quả. Tôi đã tự hỏi về việc chèn các dấu phân tách, nhưng tôi đã tìm ra rằng phải có một cách đơn giản hơn ... mà, như những người dùng khác đã chỉ ra, có! Nhưng cảm ơn trong mọi trường hợp, nó là lành mạnh để nhận thức được lựa chọn thay thế ... – Oolong

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