2013-05-23 41 views
5

Tôi bị mắc kẹt với regex này.Chuỗi phân tách regex Java bằng dấu phẩy nhưng bỏ qua dấu ngoặc kép và dấu ngoặc đơn

Vì vậy, tôi có đầu vào như:

  • "thiết bị cẩu, (đối tượng vật lý)" (X1, x2, x4), không phải là "Đây là trạng thái y tá nghiên cứu (tìm kiếm)", EntirePatellaBodyStructure (X1, X8), "Besnoitia wallacei (sinh vật)", "Catatropis (sinh vật)" (X1, x2, x4), không phải IntracerebralRouteQualifierValue, "Diospyros virginiana (sinh vật)" (X1, x2, x4), không SuturingOfHandProcedure (X1)

và cuối cùng tôi muốn nhận được là:

    .210
  • "thiết bị cẩu, (đối tượng vật lý)" (X1, x2, x4)
  • không "Đây là trạng thái y tá nghiên cứu (phát hiện)"
  • EntirePatellaBodyStructure (X1, X8)
  • "Besnoitia wallacei (vật)"
  • "Catatropis (vật)" (X1, x2, x4)
  • không IntracerebralRouteQualifierValue
  • "Diospyros virginiana (vật)" (X1, x2, x4)
  • không SuturingOfHandProcedure (X1)

Tôi đã thử regex

(\'[^\']*\')|(\"[^\"]*\")|([^,]+)|\\s*,\\s* 

Nó hoạt động nếu tôi không có một dấu phẩy bên trong dấu ngoặc đơn.

+0

bất cứ điều gì đặc biệt về 'not' và '()'! – Anirudha

+0

Có vẻ như những gì bạn muốn ở đây là một trình phân tích cú pháp chính thức và không phải regexes. – fge

+0

đây thực sự là lệnh prolog, nhưng trong trường hợp này "not" không có hiệu lực. Cũng trong ngoặc đơn là một biến, nhưng nó có thể trống. –

Trả lời

3

RegEx

(\w+\s)?("[^"]+"|\w+)(\(\w\d(,\w\d)*\))? 

Java Mã

String input = ... ; 
Matcher m = Pattern.compile(
      "(\\w+\\s)?(\"[^\"]+\"|\\w+)(\\(\\w\\d(,\\w\\d)*\\))?").matcher(input); 
while(matcher.find()) { 
    System.out.println(matcher.group()); 
} 

Output

"Crane device, (physical object)"(X1,x2,x4) 
not "Seen by research nurse (finding)" 
EntirePatellaBodyStructure(X1,X8) 
not "Besnoitia wallacei (organism)"(X1,x2,x4) 
not "Catatropis (organism)"(X1,x2,x4) 
not IntracerebralRouteQualifierValue 
not "Diospyros virginiana (organism)"(X1,x2,x4) 
not SuturingOfHandProcedure(X1) 
+0

với ví dụ mà tôi đã đưa ra trong việc xây dựng Regex của bạn hoàn hảo. Nhưng, thật không may, với ví dụ cập nhật không, cụ thể, một phần không có bất kỳ dấu ngoặc kép nào. Nhưng cảm ơn bạn, tôi sẽ cố gắng cải thiện nó. –

+0

Kiểm tra cập nhật. Đã thêm regex theo yêu cầu mới của bạn. –

+0

Cảm ơn bạn, tuyệt vời !! –

1

Không sử dụng regexes cho việc này. Viết một trình phân tích cú pháp đơn giản để theo dõi số lượng dấu ngoặc đơn gặp phải, và bạn có nằm trong dấu ngoặc kép hay không. Để biết thêm thông tin, hãy xem: RegEx match open tags except XHTML self-contained tags

0

Điều này có làm được những gì bạn cần không?

System.out.println(yourString.replaceAll(", not", "\nnot")); 
+0

Tôi xin lỗi, rằng tôi đã đưa ra ví dụ xấu. Tất nhiên "không" không có nghĩa vụ ở đây. –

+0

Ah ok, tôi hiểu ngay bây giờ với ví dụ cập nhật của bạn, tôi chắc chắn một trong những giải pháp khác sẽ làm việc cho bạn sau đó. – John484

0

Giả sử rằng không có khả năng làm tổ () trong (), và không có khả năng xảy ra (nói) \" trong "", bạn có thể viết một cái gì đó như:

private static final Pattern CUSTOM_SPLIT_PATTERN = 
    Pattern.compile("\\s*((?:\"[^\"]*\"|[(][^)]*[)]|[^\"(]+)+)"); 
private static final String[] customSplit(final String input) { 
    final List<String> ret = new ArrayList<String>(); 
    final Matcher m = CUSTOM_SPLIT_PATTERN.matcher(input); 
    while(m.find()) { 
     ret.add(m.group(1)); 
    } 
    return ret.toArray(new String[ret.size()]); 
} 

(từ chối trách nhiệm: không kiểm tra).

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