2017-10-30 12 views
7

https://www.w3.org/2005/xpath-functions/collation/html-ascii-case-insensitive/に対応するCollat​​orを作成する必要があります。つまり、比較する際にASCII A-Za-z文字の大文字と小文字の区別は無視されます。HTML ASCII大文字小文字を区別しないICUコレータ

私は、次のICU4J 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(); 

ただし、以下の比較が失敗しているようだ、私はそれが成功することを期待する場所(すなわちtrueを返す):

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

私のルールには何が欠けていますか?

答えて

2

com.ibm.icu.text.RuleBasedCollator#compare

整数値を返します。ソースとターゲットが等しい場合、値は、ソースがターゲットよりも小さい場合はゼロ未満である、値がゼロである、値はゼロより大きい源は、それが表示され

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 

目標値よりも大きい場合ルールが問題のどこにないのか、SearchIteratorコードに何か問題があるように見えます。


SearchIteratorを使用する必要がない場合は、独自の 'contains'メソッドを記述することができます。おそらくこのような何か:

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

おそらく世界で最高のコードではありませんが、あなたは考えを得るでしょう。

+0

うーんはあなたが&a=A &b=B &c=Cのようなものを意図したなどと思います。ルールが非対称であるのだろうか?例えば双方向で比較するには、 ''&p = P、P = p "'を定義する必要がありますか? – adamretter

+0

等号は両方向に作用しますので、ルールも同様です。 – ParallelNoob

+0

[ICU collat​​orカスタマイズユーザーガイド](http://userguide.icu-project.org/collat​​ion/customization)から: x = y、 "x"と "y"の間に違いがないことを示します。 – ParallelNoob

3
  1. このW3Cの「照合」は、通常の意味でCollat​​orのようには見えません。これは、ASCIIの大文字と小文字を区別しない正規表現です。私はそれが大文字と小文字を区別しないASCII文字に完全に一致する低レベルのコードと、それ以外のものすべてを正確に実装していると考えています。 https://www.w3.org/TR/xpath-functions-31/#html-ascii-case-insensitive-collation

  2. コラーレのルールは、おそらくあなたが思っていることをしません。コンマは3次差分の古い構文なので、&a=A, b=B, c=C&a=A<<<b=B<<<c=Cと同じです。私は面白いです

+1

大丈夫感謝します。しかし、私はまだ 'SearchIterator'を使って文字列を書く方法に問題があります。私は自分の質問からコードを取り出し、照合ルールを次のように変更しました: '&a = A&b = B&c = C&d = D&e = E&f = F&g = G&h = H&i = L&m = M&n = N&o = O&P = P&q = Q&r = R&s = S&t = T&u = U&v = V&w = x&y = Y&z = Z'しかし 'searchIterator.first ) 'は' -1'を返します。 – adamretter

関連する問題