> 백엔드 개발 > PHP 튜토리얼 > 정규식은 ASCII 이미지의 수직선 형성에서 세 개의 X를 감지할 수 있습니까?

정규식은 ASCII 이미지의 수직선 형성에서 세 개의 X를 감지할 수 있습니까?

Barbara Streisand
풀어 주다: 2024-11-08 02:47:01
원래의
458명이 탐색했습니다.

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

3개의 X로 이루어진 수직선 형성 여부 확인

PCRE/PHP, Perl, .NET 또는 이와 유사한 최신 정규식을 사용하여 확인하는 것이 가능합니다. ASCII "이미지"에 세 개의 X로 구성된 수직선이 있는 경우.

다음 정규 표현식을 고려하십시오.

(?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
로그인 후 복사

이 표현식은 자체 참조 캡처 그룹이 포함된 예측을 사용하여 X 앞에 있는 각 줄의 문자 수입니다. 미리보기에 지정된 조건을 일치시켜 세로 형식의 X 문자 3개를 일치시키려고 시도합니다.

온라인 데모: https://regex101 .com/r/Xb5FXl/2

3개의 X의 수직선 형성 수 계산

Perl 및 PCRE와 같이 제한된 뒷모습을 사용하는 정규식에서는 직접 해결할 수 없지만 다음은 가능합니다. 일치하는 문자열을 조작하여 개수를 간접적으로 결정합니다.

다음 솔루션은 세 개의 X가 나타나는 일치 부분의 문자 수를 일치시키고 계산하여 m.buettner의 "부분 PCRE 솔루션"을 수정합니다.

^
(?:
    (?:                   # 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
로그인 후 복사

이 표현식은 이전 표현식과 동일한 형식과 일치하지만 세 번째 캡처 그룹을 추가하고 해당 그룹 내에서 일치하는 문자의 길이를 계산합니다. 세 번째 캡처 그룹의 내용으로만 일치 항목을 대체하면 결과 문자열 길이는 3-X 형식의 수를 나타냅니다.

Perl의 사용 예:

$in =~ s/regex//gmx;
$count = length $in;
로그인 후 복사

온라인 데모: https://regex101.com/r/iqxY1a/1

테스트 사례:

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)
로그인 후 복사

위 내용은 정규식은 ASCII 이미지의 수직선 형성에서 세 개의 X를 감지할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿