Rumah > Artikel > pembangunan bahagian belakang > Bagaimanakah saya boleh menggunakan ungkapan biasa untuk mengira pembentukan menegak tiga aksara "X" berturut-turut dalam "imej" ASCII?
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.
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.
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!