【问题标题】:Does Java regex unicode support include full case folding?Java regex unicode 支持是否包括完整的大小写折叠?
【发布时间】:2022-01-11 20:17:33
【问题描述】:

假设这些字符串定义:

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()

...而 both lowerStreamupperStream 使用这些正则表达式中的每一个传递 rubular.com

/.*(ss).*/i

/.*(SS).*/i

/.*(ß).*/i

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

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

【问题讨论】:

  • “如果是这样,为什么没有明确记录?” - 你是在问为什么 Oracle 的 javadocs 没有特别提到它?
  • 你检查过Character.toUpperCase()toLowerCase()吗?只是好奇,不知道是不是不一样。
  • 我想确定我没有误解 Pattern.UNICODE_CASE 标志的期望。而且,如果其中一件事是它不支持完整的案例折叠,我想知道它是否记录在 anywhere 是这种情况,因为我没有发现任何警告该标志的 javadoc 记录
  • @markspace:我没有,但会检查

标签: java regex unicode case-folding


【解决方案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”。

【讨论】:

  • 将模式更改为使用 SS 无法在 flüßchen 上找到或匹配
  • 这可能是正则表达式中的错误。也许考虑在 Open JDK 讨论列表上提问?
猜你喜欢
  • 2019-07-03
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 1970-01-01
  • 2014-07-08
  • 2011-06-16
  • 1970-01-01
  • 2018-01-03
相关资源
最近更新 更多