Go Regexp를 사용하여 특정 문자열을 제외한 모든 것을 찾을 수 있습니까?
많은 유사한 질문이 표시된 것처럼 Go를 사용하여 특정 문자열과 일치합니다. 정규 표현식은 어려울 수 있습니다. 이 질문은 "anything/anything/somestring" 형식의 문자열과 일치하는 방법을 묻지만 "somestring"이 포함된 문자열은 제외합니다.
패턴 "/././(. )"는 "somestring"과 일치하지만 우리는 그것을 제외한 모든 것과 일치하려고 합니다. 대부분 제안된 솔루션은 "/././((?!somestring).)"을 사용하는데, 이는 수량화할 수 없는 토큰이 포함되어 있기 때문에 Go 정규식에서는 유효하지 않습니다.
Go의 regexp 모듈은 선형 실행 시간(O(n)) 제한을 보장하기 위한 예측을 지원하지 않습니다. 따라서 해결 방법이 필요합니다.
부정 패턴용 웹 서비스
한 가지 접근 방식은 정규 표현식이 일치하지 않는 웹 서비스를 사용하여 POSIX와 호환되는 부정 패턴을 생성하는 것입니다. "somestring"의 경우 생성된 패턴 는:
^(1|s(s|o(s|m(s|es(omes)(s| t(s|r(s|i(s|ns)))|o(s|ms)))))(2|o( 3|m(4|e(1|s(omes)(5|t(6|r(7|i( 8|n9)))|o(3|m(4|e1)))))))(s(s|o(s|m(s|es( 영형 mes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o((me?)?|mes(omes )*(t(r?|rin?)|o(me?)?)?))?)?$
교체 중 마지막 "(.*)"와 "
/10/10/((1 |s(s|o(s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))) )(2|o(3|m(4 |e(1|s(omes)(5|t(6| r(7|i(8|n9)))|o( 3|m(4|e1)))))))( s(s|o (s|m(s|es(omes)(s|t(s|r(s|i(s|ns)))|o(s|ms)))))(o( (나?)?|mes(omes)*(t(r?|rin?)|o(me?)?)))?)?)$
이것 정규식은 세 번째 백슬래시 다음 부분만 캡처합니다.
세 부분 모두 캡처
대체 솔루션은 관심 있는 세 부분을 모두 캡처합니다. 확인한 후 캡처 그룹 #1 값에 따라 반환할 항목을 결정할 수 있습니다.
package main import ( "fmt" "regexp" ) func main() { s := "anything/anything/somestring" r := regexp.MustCompile(`^[^/]+/[^/]+/(.*)`) val := r.FindStringSubmatch(s) // fmt.Println(val[1]) // -> somestring if len(val) > 1 && val[1] != "somestring" { // val has more than 1 element and is not equal to somestring? fmt.Println(val[1]) // Use val[1] } else { fmt.Println("No match") // Else, report no match } }
위 내용은 Go Regexp를 사용하여 특정 문자열을 제외한 모든 항목을 일치시키려면 어떻게 해야 합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!