2017-10-30 15 views
7

Tôi cần phải tạo một Trình cộng tác tương ứng với https://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive/ tức là nó bỏ qua độ nhạy trường hợp của các ký tự ASCII A-Za-z khi so sánh.Trình biên tập ICU không hợp lệ HTML ASCII

tôi đã cố gắng này với ICU4j sau RuleBasedCollator:

final RuleBasedCollator collator = 
     new RuleBasedCollator("&a=A, b=B, c=C, d=D, e=E, f=F, g=G, h=H, " 
       + "i=I, j=J, k=K, l=L, m=M, n=N, o=O, p=P, q=Q, r=R, s=S, t=T, " 
       + "u=U, v=V, u=U, v=V, w=W, x=X, y=Y, z=Z").freeze(); 

Tuy nhiên, so sánh sau đây dường như thất bại, mà tôi mong chờ nó để thành công (tức là trở true):

final SearchIterator searchIterator = new StringSearch(
     "pu", new StringCharacterIterator("iNPut"), collator); 
return searchIterator.first() >= 0; 

Tôi đang thiếu gì trong quy tắc của mình?

Trả lời

2

com.ibm.icu.text.RuleBasedCollator#compare

Trả về một giá trị số nguyên. Giá trị nhỏ hơn zero nếu nguồn là ít so với mục tiêu, giá trị là zero nếu nguồn và đích đều bình đẳng, giá trị lớn hơn không nếu nguồn lớn hơn nhắm mục tiêu

String a = "Pu"; 
String b = "pu"; 

RuleBasedCollator c1 = (RuleBasedCollator) Collator.getInstance(new Locale("en", "US", "")); 
RuleBasedCollator c2 = new RuleBasedCollator("& p=P"); 
System.out.println(c1.compare(a, b) == 0); 
System.out.println(c2.compare(a, b) == 0); 

Output 
====== 
false 
true 

Nó xuất hiện rằng các quy tắc không phải là nơi mà vấn đề nằm, một cái gì đó có vẻ là sai với mã SearchIterator.


Nếu bạn không phải sử dụng SearchIterator thì có lẽ bạn có thể viết phương thức 'contains' của riêng mình. Có thể một cái gì đó như thế này:

boolean contains(String a, String b, RuleBasedCollator c) { 
    int index = 0; 
    while (index < a.length()) { 
    if (a.length() < b.length()) { 
     return false; 
    } 

    if (c.compare(a.substring(0, b.length()), b) == 0) { 
     return true; 
    } 

    a = a.substring(1); 
    } 
    return false; 
} 

Có lẽ không phải là mã tốt nhất trên thế giới, nhưng bạn có ý tưởng.

+0

Hmm đó là thú vị. Tôi tự hỏi, nếu các quy tắc là không đối xứng? ví dụ. để so sánh theo cả hai hướng, tôi có cần định nghĩa '" & p = P, P = p "' không? – adamretter

+0

Dấu bằng hoạt động theo cả hai cách để quy tắc cũng vậy, phải không? – ParallelNoob

+0

Từ [hướng dẫn sử dụng tùy chỉnh của trình thu thập ICU] (http://userguide.icu-project.org/collation/customization): x = y, Không có sự khác biệt giữa "x" và "y". – ParallelNoob

3
  1. W3C "collation" này không giống như Collator theo nghĩa thông thường. Nó là một matcher ASCII-case-insensitive mà không cần đặt hàng. Tôi nghi ngờ rằng nó thường được thực hiện với mã mức thấp phù hợp với các chữ cái ASCII không phân biệt chữ hoa chữ thường và mọi thứ khác một cách chính xác. Xem https://www.w3.org/TR/xpath-functions-31/#html-ascii-case-insensitive-collation

  2. Quy tắc Collator có thể không làm những gì bạn nghĩ. Dấu phẩy là cú pháp cũ cho sự khác biệt đại học, vì vậy &a=A, b=B, c=C giống với &a=A<<<b=B<<<c=C. Tôi nghĩ rằng bạn đang có ý định giống như &a=A &b=B &c=C, vv

+1

không sao, cảm ơn.Tuy nhiên tôi vẫn gặp vấn đề với việc viết một chuỗi chứa phương thức sử dụng 'SearchIterator'. Tôi lấy mã từ câu hỏi của tôi và thay đổi quy tắc đối chiếu thành: '& a = A & b = B & c = C & d = D & e = E & f = F & g = G & h = H & i = I & j = J & k = K & l = L & m = M & n = P & q = Q & r = R & s = S & t = T & u = U & v = V & w = W & x = X & y = Y & z = Z' nhưng 'searchIterator.first () 'vẫn trả về' -1'. – adamretter

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