2017-02-28 1 views
1

나는 Go regex syntax과 작동하지 않는 많은 유사한 questions을 발견했습니다.Go.Regexp를 사용하여 상수 문자열을 제외한 모든 것을 일치시키는 방법이 있습니까?

일치시키려는 문자열의 길이는 anything/anything/somestring입니다. \/.*\/.*\/(.*) 패턴을 사용하면 somestring과 일치하지만 somestring이 포함 된 문자열을 제외하고는 어떤 것도 일치 시키려고합니다.

대부분의 답변은 \/.*\/.*\/((?!somestring).*)과 같은 것을 사용하지만, golang regexp에서 나는 ? The preceding token is not quantifiable을 얻습니다.

/test/test/MATCH/test/test/somestring은 일치하지 않습니다. 이것은 (제한된) Go 정규식 구문을 사용하여 가능합니까? O (N)에 진정한 정규 표현식 according to Russ Cox의 제약 조건을 만족하는 시간을 구현할 수있는 방법이 없기 때문에

+0

참조하십시오. 그것은 정말로 정규식 엔진입니까? 어쨌든, 어설 션을 사용할 수 없으므로 (필요한 경우)'(?! somestring)'이 나옵니다. 그 주위의 유일한 방법은 정규식'\ /.* \ /.* \/(. *)'을 while 회 돌이로 사용하는 것입니다. 각 일치 문자열은 그룹 1과'somestring'을 비교합니다. – sln

+2

RE2 (Go 구현)는 둘러보기를 지원하지 않습니다. 자막을 직접 확인하십시오. – JimB

답변

1

anything/anything/somestring\/.*\/.*\/(.*)으로 표시하면 안됩니다. 첫 번째 .*은 문자열에서 마지막 하나까지 /과 일치합니다. 무효화 된 문자 클래스 [^/]을 사용해야합니다. /은 Go 정규 표현식에서 이스케이프하지 않아야합니다.

을 : 용도를 이동 RE2는 lookaheads을 지원하지 않기 때문에

, 당신은 에 관심이, 그리고 캡처 그룹 # 1 값을 확인 후, 결정 세 부분이 무엇인지를 반환하는 (JimB mentions in the comments로) 캡처해야

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 
    } 
} 

주요

패키지는 거의 모든 _NOT SUPPORTED_처럼 그것은 보이는 Go demo

0

는 Golang 의도적으로이 기능을 잎 :

부족과 같은 일반화 된 주장의 부족, 역 참조 중 은 정규 표현 스타일에 대한 우리의 성명이 아닙니다. 효율적으로 구현하는 방법을 모르는 결과로 입니다. 현재 패키지 regexp에 의해 보장 된 내용을 유지하면서 즉 입력을 통해 단일 스캔을 수행하고 O (n) 시간 동안 실행하는 동안이를 구현할 수 있다면 검토해보고 해당 CL을 승인 할 것입니다. . 그러나, 나는 5 개의 년 동안 이것을하고 해제하고 아무데도 얻지 못하는 방법에 대해 숙고 해왔다.

JimB가 위에 언급 한대로 수동으로 일치 여부를 확인하는 것이 가장 좋은 방법 인 것처럼 보입니다.

관련 문제