regex 我可以匹配任意长度字符串中另一个字符正下方的字符吗?

9rygscc1  于 2022-11-26  发布在  其他
关注(0)|答案(3)|浏览(119)

给定一个任意长度的字符串,一个换行符和另一个相同长度的字符串,是否有可能生成一个正则表达式,它将匹配第一行中某个字符的正下方字符?
例如,对于所有这些输入,哪个正则表达式模式可以捕获X下面的字符:

........X..  and  .X.........  and  .....X..... etc.
...........       ...........       ...........

在我看来,你必须知道X的位置,才能匹配下面的字符。手动我可以弄清楚模式

X\.+\n.{8}(.)

在这个例子中,它捕捉了X下面的字符

........X..
...........

因为我知道X是第一行的第9个字符,但是如果X有其他位置,这就不起作用了,这是问题的核心。
所以问题是:有没有可能在正则表达式中创建一个模式,它匹配另一个字符下面的字符,它看起来像什么?

2j4z5cfb

2j4z5cfb1#

假设您事先知道第一行的长度,类似下面的代码应该适用于任何位置的X

/.*?X.{11}(.)/gs

11替换为所需的线条长度。
https://regex101.com/r/HOA9p1/2/

piok6c0g

piok6c0g2#

在不知道长度的情况下,通过Vertical Regex Matching中引入的技术,这是可能的。

^(?:.(?=.*\n(\1?.)))*?X.*\n\1?(.)

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$2Yregex101 demo)。

ejk8hzay

ejk8hzay3#

如果你正在处理你的确切的例子,那么你基本上必须构建出所有的组合,因为正则表达式不跟踪匹配的位置。如果你正在使用一个特定的编程语言,那么语言可能会提供一个解决方案,但纯正则表达式没有。

((?:X\.{10}\n)(\.))|((?:\.X\.{9}\n)(:?\.)(\.))|((?:\.{2}X\.{8}\n)(:?\.{2})(\.))

我的例子只用到了第三个位置,但你明白了...
https://regex101.com/r/atVAZK/1/

相关问题