Java 当一行中最后一个单词的长度超过41时,String.contains(";)和Regex的计算结果为false

Java 当一行中最后一个单词的长度超过41时,String.contains(";)和Regex的计算结果为false,java,regex,string,Java,Regex,String,我有一个程序,它读取一行并检查它的结构。如果该行没有点,它将忽略该行,并移动到下一个有点的行(如果该行是在没有点的行之后发现有点的第一行,它也将忽略该行) 然而,我遇到了一个问题,我注意到长队被忽略了。因此,我检查了控制台,看看它发生在哪里,它向我显示,最后一个单词超过41的行被标记为“无点”,因此被忽略 我第一次使用正则表达式来匹配圆点 if(errorCount < 1 && line.matches("^\\s{7}[^.]*$")){ //If

我有一个程序,它读取一行并检查它的结构。如果该行没有点,它将忽略该行,并移动到下一个有点的行(如果该行是在没有点的行之后发现有点的第一行,它也将忽略该行)

然而,我遇到了一个问题,我注意到长队被忽略了。因此,我检查了控制台,看看它发生在哪里,它向我显示,最后一个单词超过41的行被标记为“无点”,因此被忽略

我第一次使用正则表达式来匹配圆点

if(errorCount < 1 && line.matches("^\\s{7}[^.]*$")){ //If a line doesn't have 7 whitespaces    from the start, it's an error, that's why my regex includes that.
  System.out.println("dot1 " + line); 
  pw.println(line);
  noPeriod = true;
  continue;  
}
if(errorCount<1&&line.matches(“^\\s{7}[^.]*$”){//如果一行从一开始就没有7个空格,那就是一个错误,这就是为什么我的正则表达式包含这一点。
系统输出打印项次(“dot1”+行);
pw.println(行);
noPeriod=true;
继续;
}
后来我改成了用!行。包含(“.”)作为条件,但发生相同的情况

以下行计算正确(检测到点)

77结果A(2)的值为aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。

具有多个字符的同一行的计算结果为“无点”

77结果A(2)的值aholaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa。

起初我认为最后一个单词包含引号是个问题,但无论如何都会发生,唯一的要求是最后一个单词的长度超过41。 没有其他条件检查最后一个单词是否超过42个字符。而且,它是在最后一个字上发生的。如果我去掉VALUE和单词之间的空格,问题就不会出现了。 线条

77结果A(2)值aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa

显示没有问题。

让我们检查一下您的正则表达式。
^\s{7}[^.]*$

  • ``^`` 您首先声明匹配的位置应该从字符串的开头开始。
  • ``{7} “那么当然要匹配whitspace 7次。
  • ``[^.]*``一点也不匹配。从零到无限。 这意味着你遇到了一个点,你试图匹配从下一个字符,这将不起作用。正如主播所说,我们应该在一开始。
  • ``$``最后,我们必须匹配到字符串末尾或字符串末尾的换行符之前。
    作为一个例子,您要做的是确保整个字符串与正则表达式匹配。很明显,如果有一个点,它不会。正如所说的,不可能存在忽视你的输入的限制。他们将按照与上述类似的顺序进行评估。也许那不是你的问题。如果您阅读java正则表达式文档或查看其源代码,那么它们是一个完整的算法,似乎不会以任何方式导致这种随机行为。因此,建议在使用之前使用外部软件(如JRegex)测试您的正则表达式,以确保您想要看到的是您所看到的。让我们检查一下您的正则表达式。
    ^\s{7}[^.]*$

  • ``^`` 您首先声明匹配的位置应该从字符串的开头开始。
  • ``{7} “那么当然要匹配whitspace 7次。
  • ``[^.]*``一点也不匹配。从零到无限。 这意味着你遇到了一个点,你试图匹配从下一个字符,这将不起作用。正如主播所说,我们应该在一开始。
  • ``$``最后,我们必须匹配到字符串末尾或字符串末尾的换行符之前。

    作为一个例子,您要做的是确保整个字符串与正则表达式匹配。很明显,如果有一个点,它不会。正如所说的,不可能存在忽视你的输入的限制。他们将按照与上述类似的顺序进行评估。也许那不是你的问题。如果您阅读java正则表达式文档或查看其源代码,那么它们是一个完整的算法,似乎不会以任何方式导致这种随机行为。因此,建议在使用之前使用外部软件(如JRegex)测试您的正则表达式,以确保您希望看到的是您所看到的。我针对您的正则表达式测试了您的三个示例,它们都返回false,这是它们应该返回的。删除“.”会使其中任何一个返回true。我猜想在此之前一定有代码更改了
    行中的值。使用matches()时,不需要使用^and$,因为matches()检查整行。我怀疑这是你的问题。我用你的正则表达式测试了你所有的三个例子,它们都返回false。删除“.”会使其中任何一个返回true。我猜想在此之前一定有代码更改了
    行中的值。使用matches()时,不需要使用^and$,因为matches()检查整行。我怀疑这是你的问题。