2010-09-12 49 views
8

Tôi muốn thay thế dấu phẩy khi chỉ có dấu ngoặc đơn bên trong.Thay thế dấu phẩy trong dấu ngoặc đơn bằng cách sử dụng regex trong java

Ví dụ

Progamming languages (Java, C#, Perl) 

ĐẾN

Progamming languages (Java or C# or Perl) 

nhưng nó không nên repace dấu phẩy ở sau chuỗi

Progamming languages Java, C#, Perl 

Nó sẽ thay thế chính xác nhưng nó không phù hợp.

String test = "Progamming languages (Java, C#, Perl)"; 
String test1 = "Progamming languages Java, C#, Perl" 


String foo = replaceComma(test); 
String foo1 = replaceComma(test1); 


private static String replaceComma(String test) 
{ 
    String patternStr= "\\((?:.*)(,)(?:.*)\\)"; 
    Pattern pattern = Pattern.compile(patternStr); 
    Matcher matcher= pattern.matcher(test); 

    if(matcher.matches()) 
    { 
     return test.replaceAll("(,)", " or "); 
    } 

    return test; 

} 

CẬP NHẬT

String.replaceAll("(,)", " or "); sẽ không hoạt động khi bạn có chuỗi như thế này

Chuỗi test = "Học, ngôn ngữ (Java, C#, Perl)";

vì vậy bạn phải sử dụng @polygenelubricants đang

Trả lời

7

Bạn có thể sử dụng tích cực lookahead(?=…) như thế này:

String COMMA_INSIDE = ",(?=[^()]*\\))"; 
    String text = "a, b, c, (d, e, f), g, h, (i, j, k)"; 
    System.out.println(
     text.replaceAll(COMMA_INSIDE, " OR") 
    ); 
    // a, b, c, (d OR e OR f), g, h, (i OR j OR k) 

này phù hợp với một dấu phẩy, nhưng chỉ khi ngoặc đầu tiên bên phải của nó là thuộc loại bế mạc.

[^…]negated character class. [^()] khớp với mọi thứ trừ dấu ngoặc đơn. * là số không hoặc nhiều hơn repetition. \) (được viết dưới dạng "\\)" dưới dạng chuỗi ký tự Java) khớp với dấu ngoặc đơn đóng, theo nghĩa đen. Dấu gạch chéo ngược thoát ra nếu không có một siêu ký tự đặc biệt cho grouping.

Giả định rằng chuỗi đầu vào được tạo đúng, nghĩa là dấu ngoặc đơn luôn được cân bằng và không được lồng nhau.

+0

+1 cho sol generic. – Emil

1

lỗi bạn đang sử dụng matches thay vì find đây:

if (matcher.find()) 

Từ documentation:

  • Những nỗ lực phương pháp trận tới khớp toàn bộ chuỗi đầu vào với mẫu.
  • Phương thức tìm kiếm quét chuỗi đầu vào tìm kiếm chuỗi tiếp theo phù hợp với mẫu.

Nhưng code của bạn cũng đơn giản hóa vấn đề này một chút - nó thay thế tất cả dấu phẩy ngay cả khi chỉ có một trong số họ là trong ngoặc đơn. Nó có thể không phải là một ý tưởng tốt để sử dụng các biểu thức thông thường cho loại nhiệm vụ này.

Thay vào đó bạn có thể quét chuỗi một ký tự cùng một lúc và đếm số cặp ngoặc bạn đang ở trong đó. Khi bạn thấy số lượng ( tăng, và khi bạn thấy số lượng ) sẽ giảm. Nếu bạn thấy số , thì hãy kiểm tra xem số hiện tại có bằng không.

0

Một cách tiếp cận khác là sử dụng lookahead tích cực và lookbehind tích cực trong biểu thức chính quy của bạn. Bằng cách đó, bạn có thể tìm kiếm dấu phẩy xảy ra sau '(', nhưng trước 'a') '.

(?=X) lookahead dương

(?<=X) tích cực lookbehind

Đánh dấu là chính xác bạn cần một vòng lặp thay vì replaceAll. Nhưng bạn vẫn có thể sử dụng cụm từ thông dụng bằng kỹ thuật tôi đã mô tả.

0
String replaceComma(String input) 
{ 
String[] strSplit=input.split("[\\(\\)]"); 
    if(strSplit.length==2) 
    input=input.replaceAll(", "," or "); 
return input; 
} 

CẬP NHẬT: Đối với chuỗi của như "Học tập, ngôn ngữ (Java, C#, Perl)"

String replaceComma(String input) 
{ 
String[] splitStr=input.split("[\\(\\)]"); 
if(splitStr.length==2) 
    input=input.replace(splitStr[1],splitStr[1].replaceAll(", ", " or ")); 
return input; 
} 
+0

Câu trả lời của Poly là tốt hơn và một câu trả lời chung. Tôi chỉ đưa ra một phương pháp thay thế. – Emil

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