7

我需要创建一个对应于https://www.w3.org/2005/xpath-functions/collat ​​ion/html-ascii-case-insensitive/ 的整理器,即在进行比较时它会忽略 ASCIIA-Z和字符的大小写敏感性。a-z

我尝试使用以下 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();

但是,以下比较似乎失败了,我希望它会成功(即 return true):

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

我的规则中缺少什么?

4

2 回答 2

3
  1. 这个 W3C “排序规则”看起来不像通常意义上的 Collat​​or。这是一个不区分大小写的 ASCII 匹配器,没有排序。我怀疑它通常是用低级代码实现的,这些代码不区分大小写地匹配 ASCII 字母,而其他一切都精确匹配。见https://www.w3.org/TR/xpath-functions-31/#html-ascii-case-insensitive-collat​​ion

  2. Collat​​or 规则可能不会像您认为的那样做。逗号是第三级差异的旧语法,因此&a=A, b=B, c=C&a=A<<<b=B<<<c=C. 我想你打算像这样的东西&a=A &b=B &c=C

于 2017-11-16T20:57:31.890 回答
2

com.ibm.icu.text.RuleBasedCollat​​or#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,那么也许您可以编写自己的“包含”方法。也许是这样的:

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

也许不是世界上最好的代码,但你明白了。

于 2017-11-12T17:21:36.240 回答