在由ASCII 字元組成的圖像的基於文字的表示中,我們尋求識別三個連續“X”字元的垂直排列。影像中線條的寬度和數量可能會有所不同。
要確定這種結構的存在,我們可以使用以下正規表示式:
(?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
此表達式利用具有自引用捕獲組的前瞻為每行重複添加一個字元並“計數”它們。只有滿足所有條件,正規表示式才會匹配,表示存在該隊形。
配對使用長度
而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中文網其他相關文章!