Biểu thức chính quy và GWT


81

Câu hỏi của tôi là: Có giải pháp tốt nào để sử dụng biểu thức chính quy trong GWT không?

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ã sang JS và sau đó sử dụng regex như 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 để đối sánh nhóm.

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

Tôi đã thử Jakarta Regexp, nhưng tôi gặp vấn đề khác vì GWT không mô phỏng tất cả các phương thức của Java SDK 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 ở phía máy khách:

// 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);
    }
} 

Câu trả lời:


96

Mã tương tự 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 <trong <=matcher.getGroupCount()?
Andrey Regentov 23/12/13

@AndreyRegentov Có. Tôi đã kiểm tra, sau đó sửa lỗi đó. Điều thú vị với các lớp này là GWT cung cấp 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 bằng JUnit.
PhiLho

32

GWT 2.1 hiện có một RegExplớp có thể giải quyết vấn đề của bạn:


1
Tôi khuyên bạn nên sửa lỗi đánh máy RexExp và đặt liên kết đằng sau RegExp thay vì nội dòng nó.
antony.trupe

19

Câu trả lời này bao gồm TẤT CẢ các kết hợp mẫu, không chỉ một, như trong các câu trả lời khác ở đâ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à mảnh ghép còn thiếu. 10x rất nhiều!
gor

3

Nếu bạn muốn có một giải pháp GWT thuần túy, tôi không chắc có thể thực hiện được. 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 để lấy các nhóm phù hợp và tất cả. Bạn sẽ cần học JSNI cho đối tượng GWT và JavaScript RegExp.


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

0

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

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


chào tôi đã thử thư viện này trước đây. đó 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 bị thiếu.
ludwigm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.