【发布时间】: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 lowerStream 和 upperStream 使用这些正则表达式中的每一个传递 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