Rumah > pembangunan bahagian belakang > tutorial php > Bolehkah Ungkapan Biasa Mengesan Tiga X dalam Pembentukan Garis Menegak dalam Imej ASCII?

Bolehkah Ungkapan Biasa Mengesan Tiga X dalam Pembentukan Garis Menegak dalam Imej ASCII?

Barbara Streisand
Lepaskan: 2024-11-08 02:47:01
asal
442 orang telah melayarinya

Can a Regular Expression Detect Three Xs in a Vertical Line Formation in an ASCII Image?

Tentukan sama ada Pembentukan Garis Menegak Tiga X Wujud

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
Salin selepas log masuk

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

Kira Bilangan Pembentukan Garis Menegak Tiga X

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
Salin selepas log masuk

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;
Salin selepas log masuk

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)
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan