> 백엔드 개발 > Golang > Go에서 모든 겹치는 패턴 일치를 효율적으로 찾을 수 있는 방법은 무엇입니까?

Go에서 모든 겹치는 패턴 일치를 효율적으로 찾을 수 있는 방법은 무엇입니까?

Patricia Arquette
풀어 주다: 2024-12-04 10:04:10
원래의
889명이 탐색했습니다.

How Can I Efficiently Find All Overlapping Pattern Matches in Go?

Golang의 겹치는 패턴 일치: 종합 가이드

정규식 패키지의 제한으로 인해 Go에서는 겹치는 패턴을 일치시키는 것이 어려울 수 있습니다. . 이 기사에서는 strings.Index의 단순성과 효율성을 활용하여 중첩 패턴 일치를 효과적으로 달성하는 대체 접근 방식에 대해 설명합니다.

문제:

주어진 문자열과 "..#.."과 같은 패턴의 경우 중복 여부에 관계없이 패턴의 모든 인스턴스를 찾는 것이 목표입니다. 기존 regexp.FindAllStringSubmatchIndex 메서드는 겹치지 않는 일치 항목만 캡처합니다.

해결책:

regexp에 의존하는 대신 strings.Index 및 에 대한 loop:

func FindOverlappingPattern(input, pattern string) []int {
    idx := []int{}
    j := 0
    for {
        i := strings.Index(input[j:], pattern)
        if i == -1 {
            break
        }
        fmt.Println(j)
        idx = append(idx, j+i)
        j += i + len(pattern)
    }
    fmt.Println("Indexes:", idx)
    return idx
}
로그인 후 복사

설명:

입력 문자열의 나머지 부분에서 strings.Index를 사용하여 패턴을 반복적으로 검색하는 함수입니다. 발견된 각 양수 인덱스는 인덱스 목록에 추가됩니다. 더 이상 일치하는 항목이 발견되지 않을 때까지 루프가 계속됩니다.

샘플 사용법:

input := "...#...#....#.....#..#..#..#......."
pattern := "..#.."
result := FindOverlappingPattern(input, pattern)
// result: [1, 10, 16, 22, 29]
로그인 후 복사

이점:

이 접근 방식 간단하며 Go의 기본 문자열 검색 기능을 활용합니다. 간단한 패턴 일치 작업의 단순성과 효율성 측면에서 정규식 기반 솔루션보다 성능이 뛰어납니다.

위 내용은 Go에서 모든 겹치는 패턴 일치를 효율적으로 찾을 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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