Menggunakan perisa regex moden seperti PCRE/PHP, Perl, .NET atau yang serupa, adalah mungkin untuk menentukan jika pembentukan garis menegak tiga Xs wujud dalam "imej" ASCII.
Pertimbangkan ungkapan regex berikut:
(?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 hadapan dengan merujuk kendiri kumpulan menangkap untuk mengira bilangan aksara pada setiap baris sebelum X. Ia cuba memadankan tiga aksara X dalam pembentukan menegak dengan memadankan syarat yang dinyatakan dalam pandangan hadapan.
Demo Dalam Talian: https://regex101 .com/r/Xb5FXl/2
Walaupun ia tidak boleh diselesaikan secara langsung dalam perisa regex dengan rupa terhad seperti Perl dan PCRE, adalah mungkin untuk secara tidak langsung menentukan kiraan dengan memanipulasi rentetan yang dipadankan.
Penyelesaian berikut mengubah suai "penyelesaian PCRE separa" m.buettner dengan memadankan dan mengira bilangan aksara dalam bahagian padanan di mana tiga X berlaku.
^ (?: (?: # 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 sepadan dengan formasi yang sama seperti yang sebelumnya, tetapi ia menambahkan kumpulan penangkap ketiga dan mengira panjang aksara yang dipadankan dalam kumpulan itu. Dengan menggantikan padanan dengan hanya kandungan kumpulan penangkap ketiga, panjang rentetan yang terhasil mewakili bilangan pembentukan tiga-X.
Contoh Penggunaan dalam Perl:
$in =~ s/regex//gmx; $count = length $in;
Demo Dalam Talian: https://regex101.com/r/iqxY1a/1
Kes Ujian:
Test #0: -------------------- X X X result: 1 (X) Test #1: -------------------- ..X.... ..X.... ..X.... result: 1 (.) Test #2: -------------------- ..X.X.. ..X.X.. ....X.. result: 1 (.) Test #3: -------------------- ..X.... ..X.... ...X... result: 0 () Test #4: -------------------- ..X.... ...X... ..X.... result: 0 () Test #5: -------------------- ....X.. .X..X.. .X..... result: 0 () Test #6: -------------------- .X..X.. .X.X... .X.X... result: 1 (.) Test #7: -------------------- .X..X.. .X..X.. .X..X.. result: 2 (.X) Test #8: -------------------- XXX XXX XXX result: 3 (XXX) Test #9: -------------------- X.X.X XXXXX XXXXX .X.X. result: 5 (XXXXX) Test #10: -------------------- 1....X....... 2..X..X...X.... 3X.X...X..X..... 4X....XXXXXX..... 5X..XXX........... 6.....X.......... 7.........X....X 8..X......X....X.... 9..X......X....X....X... A....X..... B.X..X.. C..... XXX XXX XXX . result: 8 (3458.XXX)
Atas ialah kandungan terperinci Bolehkah Ungkapan Biasa Mengesan Tiga X dalam Pembentukan Garis Menegak dalam Imej ASCII?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!