我在设计正则表达式时遇到问题。我甚至不确定它是否有可能。
我想匹配n个字符,但其中一个必须是换行符(或任何已定义的字符)。
这是我的意见:
0000000
0000000
000A000
00AB000
AAAB000
ABBB000
我的(不工作)正则表达式是
.*A.{5}A.{5}A.{5}A.*
将模式更改为DOTALL
是不够的,因为我必须确保每个匹配的A
我只是想知道我的输入是否匹配,我不想提取任何内容。
我想检查输入中是否有A
- 对角线。
答案 0 :(得分:5)
/^(?:.(?=.*+\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
让我们向主人致敬 -
答案 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,}.*
答案 2 :(得分:1)
答案 3 :(得分:0)
^[^A]*|(A.{6})
试试这个。这会匹配您的输入。因为\n
.{5}
正在创建问题。当您将其更改为.{6}
时,请获取正确的输入。请参阅捕获。不要忘记添加s
和g
修饰符。
参见演示。