Java 爪哇元';不匹配*

Java 爪哇元';不匹配*,java,regex,Java,Regex,我在一个文件中有下面一行 00241386002|5296060|0|1|ClaimNote|29DEC2005:10:20:13.557194|JAR007| 我正在努力与你的对手相匹配 line.matches("^\d+\|\d+\|\d+\|\d+.+$") 该模式适用于文件中前约10k行。它也适用于前一行,这一行在时间戳中是相同的。然而,它在这方面不起作用。甚至 line.matches(".*") 返回false 任何帮助都将不胜感激 编辑: 这些行是由缓冲读取器创建的,因此

我在一个文件中有下面一行

00241386002|5296060|0|1|ClaimNote|29DEC2005:10:20:13.557194|JAR007|
我正在努力与你的对手相匹配

line.matches("^\d+\|\d+\|\d+\|\d+.+$")
该模式适用于文件中前约10k行。它也适用于前一行,这一行在时间戳中是相同的。然而,它在这方面不起作用。甚至

line.matches(".*")
返回false

任何帮助都将不胜感激

编辑:

  • 这些行是由缓冲读取器创建的,因此
    \r
    \n
    将被修剪
  • 已经尝试过清洁和建造,没有骰子
答复:

  • 感谢Pshemo在第一条评论中给出了答案。(?d)。*(unix模式)也可以工作。缓存读卡器未修剪的行末尾有一个“\u0085”,但该模式被视为行终止符
问题
\d+\\\\d+\\\\\d+\\\\\\d+
您的正则表达式的一部分似乎工作正常,这表明问题一定与
*
部分有关

让我们测试哪些字符在默认情况下不能由
匹配,这可能会阻止
匹配
返回
true

(我将只测试范围
0
-
FFFF
中的字符,但是Unicode有更多的字符-比如代理项对-所以我不是说这些字符只是
无法匹配的字符-即使是今天,我们也不能确定未来)

结果是:

AAA BBB CCCDDD
 EEE
 FFF ⬑ here we have `\u0085` (NEL) AAA BBB CCCDDD
 EEE
 FFF ⬑ 这里有“\u0085”(NEL) 正如您所看到的,不基于正则表达式引擎的工具可以返回表示单行的字符串,但仍然包含正则表达式视为行分隔符的字符

可能的解决方案 我们可以尝试让
匹配任何字符。为此,我们可以使用
模式.DOTALL
标志(我们也可以通过在正则表达式中添加
(?s)
来启用它,比如
(?s)。*


同样,我们也可以在
模式中设置正则表达式引擎。UNIX\u LINES
模式(
(?d)
标志),这将使它仅将
\n
视为行分隔符(其他字符,如
\r
将不被视为行分隔符)。

表示除行分隔符以外的任何字符。
是否可能包含
\n
\r
行匹配(“(?s.*”)的结果是什么?如果你感兴趣的话,
(?s)
代表
DOTALL
标志,它允许
也匹配行分隔符。我的情况也是这样。尝试清理并构建我无法重现您的问题:
“00241386002 | 5296060 | 0 | 1 | ClaimNote | 29DEC2005:10:20:13.557194 | JAR007 |”。匹配项(“.”
向我返回
true
。老实说,对于
匹配(“(s?.*”)
,我想不出任何数据会返回
false
。考虑张贴代码,我们可以用来轻松地再现您的问题。没有它,我不知道如何帮助你。你可以发布你自己问题的答案。由于印刷错误,我投票结束这个问题,因为@Pshemo和Kevin似乎都不想发布答案。
String data = "AAA\nBBB\rCCC\u0085DDD\u2028EEE\u2029FFF";

BufferedReader br = new BufferedReader(new StringReader(data));
String line = null;
while((line = br.readLine())!=null){
    System.out.println(line);
}
AAA BBB CCCDDD
 EEE
 FFF ⬑ here we have `\u0085` (NEL)