我遇到了以下问题(简化).我写了以下内容
Pattern pattern = Pattern.compile("Fig.*");
String s = readMyString();
Matcher matcher = pattern.matcher(s);
Run Code Online (Sandbox Code Playgroud)
在读取一个字符串时,匹配器无法匹配,即使它以"图"开头.我将问题跟踪到字符串下一部分中的流氓角色.它的codePoint值为1633
(int) charAt(i)
Run Code Online (Sandbox Code Playgroud)
但与正则表达式不匹配.我认为这是由于输入过程中某处出现了非UTF-8编码.
该Javadoc中说:
预定义的字符类.任何字符(可能与行终止符匹配也可能不匹配)
据推测,这不是严格意义上的字符,但仍然是字符串的一部分.我该如何检测这个问题?
更新:这是由于(char)10不容易发现.我上面的诊断是错误的,下面的所有答案都与所提出的问题相关并且很有用.
Jon*_*eet 13
检查这个很容易:
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);
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我的盒子上,输出是:
10
13
133
8232
8233
Run Code Online (Sandbox Code Playgroud)
其中,10和13分别是"\n"和"\ r".133(U + 0085)是"下一行",8232(U + 2028)是"行分隔符"而8233(U + 2029)是"段落分隔符".
注意:
pca*_*cao 11
将.
在Java正则表达式的任何字符匹配除行结束,除非你使用的标志Pattern.DOTALL
编译你的模式时.
为此,您将使用这样的模式:
Pattern p = Pattern.compile("somepattern", Pattern.DOTALL);
Run Code Online (Sandbox Code Playgroud)