2009-07-21 37 views
73

Câu hỏi của tôi là: Có giải pháp tốt để sử dụng cụm từ thông dụng trong GWT không?Cụm từ thông dụng và GWT

Tôi không hài lòng với việc sử dụng String.split (regex) chẳng hạn. GWT dịch Mã thành JS và sau đó sử dụng regex làm một regex JS. Nhưng tôi không thể sử dụng một cái gì đó như Java Matcher hoặc Java Pattern. Nhưng tôi sẽ cần những thứ này để kết hợp nhóm.

Có khả năng hoặc thư viện nào không?

Tôi đã thử Jakarta Regexp, nhưng tôi có các vấn đề khác vì GWT không mô phỏng tất cả các phương pháp của SDK Java mà thư viện này sử dụng.

Tôi muốn để có thể sử dụng một cái gì đó như thế này trên các mặt hàng:

// Compile and use regular expression 
Pattern pattern = Pattern.compile(patternStr); 
Matcher matcher = pattern.matcher(inputStr); 
boolean matchFound = matcher.find(); 

if (matchFound) { 
    // Get all groups for this match 
    for (int i=0; i<=matcher.groupCount(); i++) { 
     String groupStr = matcher.group(i); 
     System.out.println(groupStr); 
    } 
} 

Trả lời

87

Cùng mã sử dụng RegExp có thể là:

// Compile and use regular expression 
RegExp regExp = RegExp.compile(patternStr); 
MatchResult matcher = regExp.exec(inputStr); 
boolean matchFound = matcher != null; // equivalent to regExp.test(inputStr); 

if (matchFound) { 
    // Get all groups for this match 
    for (int i = 0; i < matcher.getGroupCount(); i++) { 
     String groupStr = matcher.getGroup(i); 
     System.out.println(groupStr); 
    } 
} 
+2

Bạn có chắc chắn rằng '<=' không nên là '<' trong '<= matcher.getGroupCount()'? –

+0

@AndreyRegentov Có. Tôi đã kiểm tra rồi sửa nó. Điều thú vị với các lớp này là GWT cung cấp một phiên bản Java thuần túy, vì vậy chúng tôi vẫn có thể kiểm tra việc sử dụng chúng với JUnit. – PhiLho

3

Nếu bạn muốn có một giải pháp GWT tinh khiết, tôi không chắc nó có thể được thực hiện. Nhưng nếu bạn sẵn sàng sử dụng JSNI, bạn có thể sử dụng đối tượng RegExp của JavaScript để có được các nhóm phù hợp và tất cả. Bạn sẽ cần phải tìm hiểu JSNI cho đối tượng GWT và JavaScript RegExp.

+0

tôi đã nghĩ về điều đó nhưng tôi không tìm thấy giải pháp tốt đẹp – ludwigm

0

GWTx library dường như cung cấp mô phỏng java.util.regex.Pattern và bạn bè. Nó không hoàn chỉnh (đặc biệt là Matcher), nhưng có thể là một khởi đầu tốt.

Kỹ thuật mà họ sử dụng để cắm triển khai các lớp Java của riêng họ cho phía máy khách là khai báo <super-source> trong mô-đun XML. Nó được đề cập trong tài liệu GWT, mô tả định dạng mô-đun XML trong "Ghi đè một gói triển khai thực hiện với một mô tả khác". Các lớp dịch JRE chuẩn trong GWT được mô phỏng theo cùng một cách.

+0

hi tôi đã thử thư viện này trước đây. nó là một giải pháp tốt cho việc thiếu mô phỏng JRe, nhưng trong trường hợp này nó không hỗ trợ nhóm. Các phương pháp cho điều này là mất tích. – ludwigm

32

GWT 2.1 bây giờ có một lớp RegExp rằng có thể giải quyết vấn đề của bạn:

+1

Tôi đề nghị sửa lỗi đánh máy RexExp và đặt liên kết đằng sau RegExp thay vì inline nó. –

+1

Cảm ơn. Tốt hơn chưa? –

17

Câu trả lời này bao gồm tất cả mô hình phù hợp, chứ không phải chỉ có một, như trong khác câu trả lời ở đây:

Chức năng:

private ArrayList<String> getMatches(String input, String pattern) { 
    ArrayList<String> matches = new ArrayList<String>(); 
    RegExp regExp = RegExp.compile(pattern, "g"); 
    for (MatchResult matcher = regExp.exec(input); matcher != null; matcher = regExp.exec(input)) { 
     matches.add(matcher.getGroup(0)); 
    } 
    return matches; 
} 

... và sử dụng mẫu:

ArrayList<String> matches = getMatches(someInputStr, "\\$\\{[A-Za-z_0-9]+\\}"); 
for (int i = 0; i < matches.size(); i++) { 
    String match = matches.get(i); 

} 
+3

Bạn hoàn toàn đúng về điều này. Đây là phần còn thiếu của câu đố. 10x rất nhiều! – gor

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