2013-05-25 25 views
9

Tôi đang cố gắng viết một regex trong Java để tìm nội dung giữa các dấu nháy đơn. Tôi có thể giúp tôi với điều này không? Tôi đã thử các sau nhưng nó không hoạt động trong một số trường hợp:Nội dung regex Java giữa các dấu nháy đơn

Pattern p = Pattern.compile("'([^']*)'"); 
  1. Test Case: 'Tumblr' là kết quả tuyệt vời ứng dụng dự kiến: Tumblr

  2. Test Case : Tumblr là một 'ứng dụng' tuyệt vời Đầu ra mong đợi: ứng dụng

  3. Test Case: Tumblr là một 'tuyệt vời' ứng dụng Dự kiến ​​sản lượng: tuyệt vời

  4. Test Case: Tumblr là 'tuyệt vời' và sản lượng dự kiến ​​'tuyệt vời': tuyệt vời, tuyệt vời

  5. Test Case: người dùng Tumblr của là thất vọng Dự kiến ​​sản lượng: NONE

  6. Test Case: Tumblr của 'mua' hoàn toàn nhưng lòng trung thành của người sử dụng nghi ngờ sản lượng dự kiến: mua lại

Tôi đánh giá cao bất kỳ sự giúp đỡ với điều này.

Cảm ơn.

+0

Có không cần phải thực thi không có dấu cách bên trong dấu ngoặc kép thực sự (mà sẽ làm cho _'awesone và tuyệt vời'_ không được xuất hiện), bạn chỉ có thể nhìn xung quanh dấu ngoặc kép. –

Trả lời

12

này nên làm như lừa:

(?:^|\s)'([^']*?)'(?:$|\s) 

Ví dụ: http://www.regex101.com/r/hG5eE1

Trong Java (ideone):

import java.util.*; 
import java.lang.*; 
import java.util.regex.*; 

class Main { 

     static final String[] testcases = new String[] { 
      "'Tumblr' is an amazing app", 
     "Tumblr is an amazing 'app'", 
     "Tumblr is an 'amazing' app", 
     "Tumblr is 'awesome' and 'amazing' ", 
     "Tumblr's users' are disappointed ", 
     "Tumblr's 'acquisition' complete but users' loyalty doubtful" 
     }; 

    public static void main (String[] args) throws java.lang.Exception { 
     Pattern p = Pattern.compile("(?:^|\\s)'([^']*?)'(?:$|\\s)", Pattern.MULTILINE); 
     for (String arg : testcases) { 
      System.out.print("Input: "+arg+" -> Matches: "); 
      Matcher m = p.matcher(arg); 
      if (m.find()) { 
       System.out.print(m.group()); 
       while (m.find()) System.out.print(", "+m.group()); 
       System.out.println(); 
      } else { 
       System.out.println("NONE"); 
      } 
     } 
    } 
} 
+0

Tôi nhận ra rằng câu trả lời của bạn mạnh mẽ hơn khi tôi thử nghiệm nhiều tình huống hơn. Ước gì tôi có đủ danh tiếng để upvote câu trả lời. – user1744332

+0

nó không thực sự hoàn thành bởi vì các dấu nháy đơn là một phần của đầu ra ;-). Nó có thể được sửa với m.group(). Thay thế ('\' ',' \ u0000 ') – dermoritz

+0

@dermoritz không cần thiết cho điều đó; cùng một regex sẽ nắm bắt chuỗi với dấu ngoặc kép trong nhóm (0) và không có dấu ngoặc kép trong nhóm (1). http://ideone.com/m9t1AF –

0

Hãy thử mô hình này regex đơn giản:

'([^\s']+)' 

và mã kiểm tra:

try { 
    Pattern regex = Pattern.compile("'([^\\s']+)'"); 
    Matcher regexMatcher = regex.matcher(subjectString); 
    while (regexMatcher.find()) { 
     for (int i = 1; i <= regexMatcher.groupCount(); i++) { 
      // matched text: regexMatcher.group(i) 
      // match start: regexMatcher.start(i) 
      // match end: regexMatcher.end(i) 
     } 
    } 
} catch (PatternSyntaxException ex) { 
    // Syntax error in the regular expression 
} 
0

Chỉ cần không để ' ' xuất hiện ở đầu ra. Sử dụng regex này:

'([^' ]*)'

Hoặc đảm bảo cặp ngoặc kép được bao bọc bởi khoảng trắng.

(?:^|)'([^']*)'(?: |$)
+0

Điều này sẽ không khớp với "..." tuyệt vời và xinh đẹp '... " –

+0

@guido Hãy thử giải pháp mới. – johnchen902

+0

tốt hơn, nhưng bạn vẫn có không gian thay vì khoảng trắng, và không kết thúc dòng (sau đó nó giống như của tôi ;-) –

3

Nếu bạn không cho phép các ký tự đơn báo giá, ', hoặc các nhân vật không gian, ' ', để được trong mô hình, sau đó bạn tốt để đi.Tôi đã từng + vì tôi cho rằng bạn không muốn một mục rỗng (nếu không muốn nói, thay đổi nó trở lại một *):

Pattern p = Pattern.compile("'([^' ]+)'"); 
+0

Điều này làm việc cho đầu vào, khó khăn cần lưu ý rằng Paul Vargas và mẫu của tôi cũng sẽ chấp nhận khoảng trắng bên trong chuỗi phù hợp. –

+0

Tôi đồng ý; các giải pháp của bạn tốt và có ý nghĩa, nhưng không có đầu vào ví dụ nào cho rằng OP muốn nắm bắt nhiều từ, vì vậy trong nỗ lực giữ mã càng gần càng tốt với mã/giới hạn của OP, tôi đã nghĩ ra điều này. –

+0

có. Tôi đồng ý với @guido. – user1744332

1

Hãy thử tiếp theo:

'\w+'|'\w+(\s\w+)*' 

https://github.com/paul-vargas/java-regex-ui