Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh menggunakan ungkapan biasa untuk mengira pembentukan menegak tiga aksara "X" berturut-turut dalam "imej" ASCII?

Bagaimanakah saya boleh menggunakan ungkapan biasa untuk mengira pembentukan menegak tiga aksara "X" berturut-turut dalam "imej" ASCII?

Patricia Arquette
Patricia Arquetteasal
2024-11-08 06:18:02281semak imbas

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

Pemadanan Regeks Menegak dalam "Imej" ASCII

Pernyataan Masalah

Dalam perwakilan berasaskan teks imej yang terdiri daripada aksara ASCII, kami berusaha untuk mengenal pasti pembentukan menegak tiga aksara "X" berturut-turut. Lebar dan bilangan garisan dalam imej boleh berbeza-beza.

Kewujudan Padan (Soalan 1)

Untuk menentukan kewujudan formasi sedemikian, kita boleh menggunakan regex berikut:

(?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

Ungkapan ini memanfaatkan pandangan ke hadapan dengan merujuk kendiri kumpulan menangkap untuk menambah aksara bagi setiap ulangan baris dan "mengira" mereka. Hanya apabila semua syarat dipenuhi, regex akan sepadan, menunjukkan kehadiran pembentukan.

Mengira Kejadian (Soalan 2)

Padanan Menggunakan Panjang

Walaupun PCRE dan Perl (dan perisa serupa) tidak boleh mengira secara langsung kejadian menggunakan regex, penyelesaian alternatif ialah menggunakan panjang hasil penggantian sebagai ukuran. Dengan menggantikan semua kemunculan ungkapan berikut dengan "$3", panjang rentetan yang terhasil memberikan kiraan:

^
(?:
    (?:                   # 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

Ungkapan ini menggunakan pendekatan yang serupa dengan Soalan 1 tetapi memasukkan X dalam aksara yang dikira dan mengukur nombor daripada padanan menggunakan pandangan ke hadapan.

Padankan Menggunakan Padanan

Walaupun pandangan belakang panjang berubah-ubah tidak tersedia dalam kebanyakan perisa regex, sesetengahnya, seperti Java dan .NET, boleh menyediakan penyelesaian separa . Dengan menggunakan lookbehinds, anda boleh mengira kejadian secara terus tanpa bergantung pada panjang hasil penggantian.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menggunakan ungkapan biasa untuk mengira pembentukan menegak tiga aksara "X" berturut-turut dalam "imej" ASCII?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn