我遇到了以下问题(简化)。我写了以下内容
Pattern pattern = Pattern.compile("Fig.*");
String s = readMyString();
Matcher matcher = pattern.matcher(s);
在读取一个字符串时,匹配器无法匹配,即使它以“Fig”开头。我将问题追溯到字符串下一部分中的流氓字符。它的代码点值为 1633
(int) charAt(i)
但与正则表达式不匹配。我认为这是由于输入过程中某处的非 UTF-8 编码造成的。
The Javadocs say:
预定义字符类
。任何字符(可能匹配也可能不匹配行终止符)
据推测,这不是严格意义上的字符,但它仍然是字符串的一部分。我如何检测这个问题?
更新:这是由于 (char)10 不容易发现。我上面的诊断是错误的,下面的所有答案都与所提出的问题相关并且很有用。
检查这一点很容易:
import java.util.regex.*;
public class Test {
public static void main(String[] args) {
Pattern pattern = Pattern.compile(".");
for (char c = 0; c < 0xffff; c++) {
String text = String.valueOf(c);
if (!pattern.matcher(text).matches()) {
System.out.println((int) c);
}
}
}
}
在我的盒子上,输出是:
10
13
133
8232
8233
其中,10 和 13 分别是“\n”和“\r”。 133 (U+0085) 是“下一行”,8232 (U+2028) 是“行分隔符”,8233 (U+2029) 是“段落分隔符”。
注意:
- 这不会测试基本多语言平面之外的任何 Unicode 字符
- 它仅使用默认选项
- 这似乎与你对角色 1633 (U+0661) 的体验相矛盾
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)