给定一个任意长度的字符串,一个换行符和另一个相同长度的字符串,是否有可能生成一个正则表达式,它将匹配第一行中某个字符的正下方字符?
例如,对于所有这些输入,哪个正则表达式模式可以捕获X下面的字符:
........X.. and .X......... and .....X..... etc.
........... ........... ...........
在我看来,你必须知道X的位置,才能匹配下面的字符。手动我可以弄清楚模式
X\.+\n.{8}(.)
在这个例子中,它捕捉了X下面的字符
........X..
...........
因为我知道X是第一行的第9个字符,但是如果X有其他位置,这就不起作用了,这是问题的核心。
所以问题是:有没有可能在正则表达式中创建一个模式,它匹配另一个字符下面的字符,它看起来像什么?
3条答案
按热度按时间2j4z5cfb1#
假设您事先知道第一行的长度,类似下面的代码应该适用于任何位置的
X
:将
11
替换为所需的线条长度。https://regex101.com/r/HOA9p1/2/
piok6c0g2#
在不知道长度的情况下,通过Vertical Regex Matching中引入的技术,这是可能的。
Here is a demo at regex101
这在支持 * 前向引用 * 的正则表达式风格中起作用,如PCRE、.NET、Python、Java(不在JS中)。
使用possessive
\1?+
,如果X
的偏移量超出下面行的末尾,则返回will even fail。(?:
非捕获组)
获得repeated时,lookahead内部的capturing group通过在每个重复上添加来自连续行的字符来从自身 * 增长 *,直到X
将被匹配。\1
是来自连续行的 * 第一组 * 捕获的内容的reference,第二组显示了X
下面的字符。使用另一个捕获组将 *
X
下面的 * 字符替换为Y
的变体:搜索
^((?:.(?=.*\n(\2?.)))*?X.*\n)\2?.
并替换为$1$2Y
(regex101 demo)。ejk8hzay3#
如果你正在处理你的确切的例子,那么你基本上必须构建出所有的组合,因为正则表达式不跟踪匹配的位置。如果你正在使用一个特定的编程语言,那么语言可能会提供一个解决方案,但纯正则表达式没有。
我的例子只用到了第三个位置,但你明白了...
https://regex101.com/r/atVAZK/1/