Java 查找正好(或至少)有一个换行符的n个字符
我在设计正则表达式时遇到问题。我甚至不确定这是否可能 我想匹配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}正在产生问题。
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
与子模式1相同(\2?+)
使行前进*+\n
与子模式1和2相同(\3?+)
完成前瞻)
零或更多)*?
(来源:) 然而,由于不情愿对该群体进行量化,因此会发生以下情况:
(来源:) 请注意,虽然彩色组可能会被捕获,也可能不会被捕获,但指针位置在捕获过程中保持不变。因此,在第一次迭代中,所有捕获组都不捕获任何内容。因此,我们进入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