Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 查找正好(或至少)有一个换行符的n个字符_Java_Regex_Regex Lookarounds_Regex Group - Fatal编程技术网

Java 查找正好(或至少)有一个换行符的n个字符

Java 查找正好(或至少)有一个换行符的n个字符,java,regex,regex-lookarounds,regex-group,Java,Regex,Regex Lookarounds,Regex Group,我在设计正则表达式时遇到问题。我甚至不确定这是否可能 我想匹配n个字符,但其中一个必须是换行符(或任何定义的字符) 这是我的意见: 0000000 0000000 000A000 00AB000 AAAB000 ABBB000 我的(不工作)正则表达式是 将模式更改为DOTALL是不够的,因为我必须确保每个匹配的A 我只想知道我的输入是否匹配,我不想提取任何东西 我想检查我的输入中是否有A-对角线 ^[^A]*|(A.{6}) 尝试此操作。这将匹配您的输入。因为有一个\n{5}正在产生问题。

我在设计正则表达式时遇到问题。我甚至不确定这是否可能

我想匹配n个字符,但其中一个必须是换行符(或任何定义的字符)

这是我的意见:

0000000
0000000
000A000
00AB000
AAAB000
ABBB000
我的(不工作)正则表达式是

将模式更改为
DOTALL
是不够的,因为我必须确保每个匹配的
A

我只想知道我的输入是否匹配,我不想提取任何东西

我想检查我的输入中是否有
A
-对角线

^[^A]*|(A.{6})
尝试此操作。这将匹配您的输入。因为有一个
\n
{5}
正在产生问题。当您将其更改为
{6}
时,您将获得正确的输入。请查看捕获。不要忘记添加
s
g
修饰符

见演示


下面的正则表达式将确保在a之间存在换行符

(?:(A)(?:(?=.*?\n)(?=.*?.).){6}){1,}(?=(A))

带点所有的
也以换行符计算。可能您想要像
A(?:[\r\n]*[^\r\n]){5}
,其中我使用
[\r\n]
作为换行符,而否定
[^\r\n]
作为非换行符

此操作至少重复4次,前后任意数量的字符:

.*?(?:A(?:[\r\n]*[^\r\n]){5}[\r\n]*){4,}.*
另外,还可以在
a
之后使用负号来验证是否存在不带换行符的至少7个字符的序列:
(?![^\r\n]{7})
,因此模式变为:

.*?(?:A(?![^\r\n]{7})(?:[\r\n]*[^\r\n]){5}[\r\n]*){4,}.*

自参考组(Qtax技巧) 说明:

  • ^
    行的开头
  • (?:。
    匹配除换行符以外的任何字符
  • (?=
    正向前瞻:声明以下内容可以匹配。此部分用于捕获
  • *+\n
    将所有内容匹配到行,然后再匹配换行符本身
  • (\1?+)
    • ?+
      :如果此组已匹配,请使用并向该组添加一个字符,否则只需匹配一个字符,然后继续
  • *+\n
    将所有内容匹配到下一行,同上
  • (\2?+)
    与子模式1相同
  • *+\n
    使行前进
  • (\3?+)
    与子模式1和2相同
  • 完成前瞻
  • )*?
    零或更多
上述组执行以下操作。注意彩色组:


(来源:)

然而,由于不情愿对该群体进行量化,因此会发生以下情况:


(来源:)

请注意,虽然彩色组可能会被捕获,也可能不会被捕获,但指针位置在捕获过程中保持不变。因此,在第一次迭代中,所有捕获组都不捕获任何内容。因此,我们进入regexp的下一部分:

  • …A
    三个字符,然后是一个“A”(文字字符)
  • *+\n
    跳过行的其余部分,换行符
  • \1?+
    如果我们抓到了第一组,就吃掉它
  • .A
    两个字符,然后是一个“A”(文字字符)
  • *+\n
    下一行
  • \2?+
    尽可能使用
  • .A
    你明白了,但我还是会写文本的。和楼上一样
  • *+\n
    前进
  • \3?+
  • A
    比赛结束
如果你不喜欢文字,我再画一次:


(来源:)

让我们向我们的主人鞠躬-


这是a,这是a。

输出应该是什么?应该匹配什么?输入示例与正则表达式
A.{5}A.{5}A.{5}
不理解问题:)我的示例正则表达式不工作。我的示例输入应该与正则表达式匹配。只有当您将最后一行之前的行更改为
AAAB00A
时,它才起作用。我不确定我是否理解,但是:
*A+.*
(将
A
替换为所需的字符),您将匹配至少有一个
A
的任何字符串。这匹配除前两行之外的所有行。使用
\n
作为字符,它将匹配所有字符。如果我的是正确的,取决于OP要求,期待着看到你的@unihedrona在仔细查看你的正则表达式如何工作后,我意识到你的正则表达式匹配得非常好,在成功匹配和失败匹配方面都比我的正则表达式有效,但当宽度不同或不固定时,它不能正常工作。我现在不想理解:]我给你画了一张照片@Jonny5:)非常好的插图和有趣的方法@Unihedron:)你为什么要抓拍?
.*?(?:A(?![^\r\n]{7})(?:[\r\n]*[^\r\n]){5}[\r\n]*){4,}.*
/^(?:.(?=.*+\n(\1?+.).*+\n(\2?+.).*+\n(\3?+.)))*?...A.*+\n\1?+..A.*+\n\2?+.A.*+\n\3?+A/m