找到具有完全(或至少)一个换行符的n个字符

时间:2014-09-30 10:46:31

标签: java regex regex-lookarounds regex-group

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

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

这是我的意见:

0000000
0000000
000A000
00AB000
AAAB000
ABBB000

我的(不工作)正则表达式是

.*A.{5}A.{5}A.{5}A.*

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

之间存在一个换行符

我只是想知道我的输入是否匹配,我不想提取任何内容。

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

4 个答案:

答案 0 :(得分:5)

自我引用组(Qtax Trick)

/^(?:.(?=.*+\n(\1?+.).*+\n(\2?+.).*+\n(\3?+.)))*?...A.*+\n\1?+..A.*+\n\2?+.A.*+\n\3?+A/m

说明:

  • ^开始一行。
  • (?:.匹配除换行符之外的任何字符。
  • (?=正向前瞻:断言可以匹配以下内容。这部分是为了捕捉。
  • .*+\n将所有内容与该行匹配,然后匹配换行符。
  • (\1?+.)
    • ?+:如果此组已匹配,请使用并向该组添加一个字符,否则只需匹配一个字符,然后前进。
  • .*+\n匹配下一行的所有内容,与上述相同。
  • (\2?+.) 与子模式1相同。
  • .*+\n推进这条线。
  • (\3?+.) 与子模式1和2相同。
  • )完成前瞻。
  • )*?零或更多,match reluctantly

上述群组执行以下操作。请注意彩色组:

pic http://gyazo.com/f45e1ddb77012c5d4933f2b139ffc29d.png

然而,因为这个群体不情愿地量化,所以会发生这种情况:

pic http://gyazo.com/ea5a724631538408db6099d9a286da62.png

请注意,虽然可以捕获或不捕获彩色组,但捕获期间指针位置保持不变。因此,在第一次迭代时,所有捕获组都捕获 nothing 。因此,我们转到正则表达式的下一部分:

  • ...A三个字符,然后是“A”(字面字符)。
  • .*+\n浏览线的其余部分和换行符...
  • \1?+ 如果我们捕获了第一组,请使用它!
  • ..A两个字符,然后是“A”(字面字符)。
  • .*+\n下一行。
  • \2?+尽可能消费。
  • .A你明白了,但无论如何我都会写文字。和楼上一样。
  • .*+\n前进。
  • \3?+ ......
  • A比赛结束!

如果你不喜欢文字,我会再画画一次:

pic http://gyazo.com/e84f76d78243c89c9acadbdefbf262bb.png

让我们向主人致敬 -

“vertical” regex matching in an ASCII “image”

这是一个code demo,这里是regex demo of an extended version

答案 1 :(得分:3)

使用DOTALL时,.也会计入换行符。您可能需要A(?:[\r\n]*[^\r\n]){5},例如我使用[\r\n]作为换行符,而将[^\r\n]作为非换行符。

在此之前或之后,任何数量的任何字符重复至少4次:

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

其他可以在A之后使用否定lookahead来验证,如果没有换行符,则不会包含至少7个字符的序列:(?![^\r\n]{7})因此模式变为:

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

Test at regex101

答案 2 :(得分:1)

在正则表达式下方可以确保A之间存在换行符。

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

DEMO

答案 3 :(得分:0)

^[^A]*|(A.{6})

试试这个。这会匹配您的输入。因为\n .{5}正在创建问题。当您将其更改为.{6}时,请获取正确的输入。请参阅捕获。不要忘记添加sg修饰符。

参见演示。

http://regex101.com/r/nA6hN9/46