什么时候'.' 在正则表达式中不匹配?

pet*_*ust 11 java regex

我遇到了以下问题(简化).我写了以下内容

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)是"段落分隔符".

注意:

  • 这不会测试基本多语言平面之外的任何Unicode字符
  • 它仅使用默认选项
  • 这似乎与你的角色1633(U + 0661)的经历相矛盾


pca*_*cao 11

.在Java正则表达式的任何字符匹配行结束,除非你使用的标志Pattern.DOTALL编译你的模式时.

为此,您将使用这样的模式:

Pattern p = Pattern.compile("somepattern", Pattern.DOTALL);
Run Code Online (Sandbox Code Playgroud)