0

假设这些字符串定义:

String lowerStream = "flüßchen";
String upperStream = "FLÜSSCHEN";
String streamPattern = ".*(ss).*";

使用这种模式:

Pattern pattern = Pattern.compile(streamPattern, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);

...这个断言通过:

assertThat( pattern.matcher(upperStream).find() ).isTrue()

...而这个失败了:

assertThat( pattern.matcher(lowerStream).find() ).isTrue()

...而两者都 lowerStream使用这些正则表达式upperStream传递rubular.com :

/.*(ss).*/i

/.*(SS).*/i

/.*(ß).*/i

String.equalsIgnoreCase()使用、String.toLowerCase().equals()或中的任何一个也无法成功进行比较String.toUpperCase().equals()

java的unicode正则表达式是否只支持简单的大小写折叠?如果是这样,为什么没有明确记录?

4

1 回答 1

1

在我的系统上,它似乎正确地将小写转换为大写:

public class IfTesting {

   public static void main( String[] args ) {
      String lowerStream = "flüßchen";
      String upperStream = "FLÜSSCHEN";
      System.out.println( "upper case: " + Arrays.toString( upperStream.getBytes()) );
      System.out.println( "lower case to upper: " + Arrays.toString( lowerStream.toUpperCase().getBytes() ) );
   }

}

输出结果:

run:
upper case: [70, 76, -61, -100, 83, 83, 67, 72, 69, 78]
lower case to upper: [70, 76, 85, -52, -120, 83, 83, 67, 72, 69, 78]
BUILD SUCCESSFUL (total time: 0 seconds)

您可以看到“S”(十进制的 83)出现在输出中。我不知道这是否有帮助,但在某种程度上,Java 似乎了解如何转换您提供的字符。OTOH 我猜由于 83 显然在 ASCII 范围内,如果您尝试另一种方式,它将被转换为小写的 ASCII 's'。所以这可能会使转换为大写更好。您在匹配字符串中使用小写“ss”。

于 2021-12-06T16:42:48.703 回答