특정 수의 일치 항목만 얻기 위해 정규식을 사용하여 문자열을 구문 분석하는 방법은 무엇입니까? [폐쇄]

특정 수의 일치 항목만 얻기 위해 정규식을 사용하여 문자열을 구문 분석하는 방법은 무엇입니까? [폐쇄]

현재 다음 정규식을 사용하여 문자열을 그룹으로 분할하고 있습니다.

^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$

Pty[R=4]@ID

네 개의 그룹이 있어요

1) Pty
2) [R=4]
3) R=4
4) ID

하지만 세 그룹만 필요합니다.

1) Pty
2) R=4
3) ID

이 정규식은 두 그룹을 모두 가져오려면 Pty@ID도 허용할 수 있어야 합니다.

1) Pty
2) ID

이 목표를 어떻게 달성할 수 있나요?

답변1

도구를 지정하지 않았으므로 perl다음 예를 사용합니다.

$ echo Pty[R=4]@ID | perl -nle '
    print "$1\n$2\n$3\n$4"
        if /^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty
[R=4]
R=4
ID

$ echo Pty@ID | perl -nle '
    print "$1\n$2\n$3\n$4"
        if /^([a-zA-Z0-9]*)(\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty


ID

정규식 캡처 그룹을 사용하면 다음을 사용할 수 있습니다.역참조이전 일치 항목을 가져옵니다. 에서는 , ,..., 을 perl사용할 수 있습니다 .$1$2$n

귀하의 경우에는 다음을 사용할 수 있습니다비캡처 그룹[R=4]잡히지 않으려면 :

$ echo Pty[R=4]@ID |
perl -nle '
    print "$1\n$2\n$3"
        if /^([a-zA-Z0-9]*)(?:\[([a-zA-Z0-9=]*)\]){0,1}@([a-zA-Z0-9]*)$/
'
Pty
R=4
ID

php댓글에서 언급했듯이 다음을 사용할 수 있습니다 .PHP 역참조문법 \1또는 \g1또는 \g{1}.

관련 정보