Dalam konteks menganalisis imej atau peta ASCII, situasi mungkin timbul di mana mengenal pasti corak tertentu menjadi perlu. Satu corak sedemikian ialah pembentukan garis menegak tiga Xs. Menggunakan ungkapan biasa, adalah mungkin untuk menangani tugas ini dengan berkesan.
Untuk menentukan sama ada garis menegak pembentukan tiga X wujud, ungkapan biasa berikut boleh digunakan:
(?xm) # ignore comments and whitespace, ^ matches beginning of line ^ # beginning of line (?: . # any character except \n (?= # lookahead .*+\n # go to next line ( ?+ . ) # add a character to the 1st capturing group .*+\n # next line ( ?+ . ) # add a character to the 2nd capturing group ) )*? # repeat as few times as needed X .*+\n # X on the first line and advance to next line ?+ # if 1st capturing group is defined, use it, consuming exactly the same number of characters as on the first line X .*+\n # X on the 2nd line and advance to next line ?+ # if 2st capturing group is defined, use it, consuming exactly the same number of characters as on the first line X # X on the 3rd line
Ungkapan ini menggunakan pandangan ke hadapan dengan kumpulan menangkap rujukan sendiri untuk mengira bilangan aksara pada setiap baris sebelum X muncul. Jika corak dikesan, ungkapan akan berjaya dipadankan.
Manakala pemadanan langsung menggunakan ungkapan biasa tidak dapat menyediakan kiraan tepat pembentukan garisan menegak kerana keupayaan melihat belakang terhad, wujud penyelesaian tidak langsung.
Dengan menggantikan semua padanan ungkapan berikut dengan $3, anda boleh mendapatkan jawapan kepada soalan dua (bilangan pola bagi interests) sebagai panjang rentetan yang terhasil:
^ (?: (?: # match .+? characters . (?= # counting 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 ( ?+ . ) # the 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 teknik yang serupa dengan soalan pertama, tetapi dengan pengubahsuaian untuk memasukkan X dalam aksara yang dipadankan dalam pandangan pertama dan membungkusnya dengan pengkuantiti untuk mengira bilangan padanan.
Dengan menggunakan panjang rentetan yang terhasil sebagai kiraan, penyelesaian ini menyediakan pendekatan tidak langsung untuk menjawab soalan dua.
Atas ialah kandungan terperinci Bolehkah Ungkapan Biasa Digunakan untuk Mengira Pembentukan Garis Menegak dalam Imej ASCII?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!