首页 > 后端开发 > php教程 > 如何使用正则表达式来计算 ASCII'图像”中三个连续'X”字符的垂直排列?

如何使用正则表达式来计算 ASCII'图像”中三个连续'X”字符的垂直排列?

Patricia Arquette
发布: 2024-11-08 06:18:02
原创
318 人浏览过

 How can I use regular expressions to count vertical formations of three consecutive

ASCII“图像”中的垂直正则表达式匹配

问题陈述

在由 ASCII 字符组成的图像的基于文本的表示中,我们寻求识别三个连续“X”字符的垂直排列。图像中线条的宽度和数量可能会有所不同。

匹配存在性(问题 1)

要确定这种结构的存在,我们可以使用以下正则表达式:

(?xm)
^                        # Beginning of line
(?:
    .                    # Any character except newline
    (?=                  # Lookahead
        .*+\n            # Move to next line
        ( ?+ . )       # Add a character to capturing group 1
        .*+\n            # Next line
        ( ?+ . )       # Add a character to capturing group 2
    )
)*?                      # Repeat as necessary
X .*+\n                  # X on first line, advance to next line
?+                     # If capturing group 1 is defined, use it
X .*+\n                  # X on second line, advance to next line
?+                     # If capturing group 2 is defined, use it
X                        # X on third line
登录后复制

此表达式利用具有自引用捕获组的前瞻为每行重复添加一个字符并“计数”它们。只有满足所有条件,正则表达式才会匹配,表明存在该队形。

计数出现次数(问题 2)

匹配使用长度

而 PCRE 和 Perl(以及类似的风格)无法使用正则表达式直接计算出现次数,替代解决方案是使用替换结果的长度作为度量。通过将所有出现的以下表达式替换为“$3”,生成的字符串的长度提供了计数:

^
(?:
    (?:                   # Match .+? characters
        .
        (?=               # Count the same number on the following two lines
            .*+\n
            ( ?+ . )
            .*+\n
            ( ?+ . )
        )
    )+?
    (?<= X )              # Till the above consumes an X
    (?=                   # That matches the following conditions
        .*+\n
        ?+
        (?<= X )
        .*+\n
        ?+
        (?<= X )
    )
    (?=                   # Count the number of matches
        .*+\n
        ( ?+ . )        # Number of matches = length of 
    )
)*                        # Repeat as long as there are matches on this line
.*\n?                     # Remove the rest of the line
登录后复制

此表达式采用与问题 1 类似的方法,但在计数的字符中包含 X 并量化数字使用前瞻进行匹配。

使用匹配匹配

尽管可变长度后向查找在大多数正则表达式风格中不可用,但有些(例如 Java 和 .NET)可以提供部分解决方案。通过使用lookbehinds,可以直接计算出现次数,而不依赖于替换结果的长度。

以上是如何使用正则表达式来计算 ASCII'图像”中三个连续'X”字符的垂直排列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板