>백엔드 개발 >Golang >둘러보기 없이 Go 정규식에서 부정 일치를 효과적으로 수행하려면 어떻게 해야 합니까?

둘러보기 없이 Go 정규식에서 부정 일치를 효과적으로 수행하려면 어떻게 해야 합니까?

Mary-Kate Olsen
Mary-Kate Olsen원래의
2024-12-20 12:39:09465검색

How Can I Effectively Perform Negative Matching in Go Regular Expressions Without Lookarounds?

Go Regex의 부정 일치

Go 정규 표현식에서는 둘러보기 구성이 부족하기 때문에 특정 상수 문자열을 제외한 모든 항목을 일치시키는 것이 어려울 수 있습니다. .

원본 RegExp:

제공된 정규식 /.*/.*/(.*)는 세 개의 백슬래시 뒤의 모든 항목과 일치합니다. 단, "somestring"이 포함된 문자열은 제외하지 않습니다.

부정 접근 방식

방법 1: 웹 서비스

하나 해결 방법에는 POSIX 호환 부정 패턴을 생성하는 웹 서비스를 사용하는 것이 포함됩니다. "somestring"의 경우 원본 RegExp로 대체될 수 있는 복잡한 패턴이 생성됩니다.

/[^/]*/[^/]*/^([^s]|s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*([^os]|o([^ms]|m([^es]|e([^s]|s(omes)*([^ost]|t([^rs]|r([^is]|i([^ns]|n[^gs])))|o([^ms]|m([^es]|e[^s]))))))))*(s(s|o(s|m(s|es(omes)*(s|t(s|r(s|i(s|ns)))|o(s|ms)))))*(o((me?)?|mes(omes)*(t(r?|rin?)|o(me?)?)?))?)?$

방법 2: 문자 클래스

.*를 사용하는 대신 , 다음 표현식은 부정 문자 클래스 [^/]를 사용합니다.

`[^/]+/[^/]+/(.*)`

이것은 무엇이든 일치합니다. 세 번째 백슬래시까지 가능하지만 "somestring"이 있는 문자열은 제외되지 않습니다.

캡처 그룹을 사용한 해결 방법

RE2(Go에서 사용)는 미리보기를 지원하지 않기 때문에 , 문자열의 세 부분을 모두 캡처하고 캡처 그룹의 추출된 값을 확인할 수 있습니다.

import (
    "fmt"
    "regexp"
)

func main() {
    s := "anything/anything/somestring"
    r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`)
    val := r.FindStringSubmatch(s)
    if len(val) > 1 && val[1] != "somestring" {
        fmt.Println(val[1])
    } else {
        fmt.Println("No match")
    }
}

이것은 접근 방식은 일치하는 값을 캡처하고 "somestring"과 일치하지 않으면 인쇄합니다.

위 내용은 둘러보기 없이 Go 정규식에서 부정 일치를 효과적으로 수행하려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.