Go의 바꾸기AllString: 달러 기호가 왜 그렇게 이상하게 작동합니까?

Mary-Kate Olsen
풀어 주다: 2024-10-28 08:51:02
원래의
424명이 탐색했습니다.

 Go's ReplaceAllString: Why Do Dollar Signs Behave So Strangely?

Go의 ChangeAllString 함수: 구문 및 출력 탐구

Go의 regexp 패키지를 탐색하는 동안 우연히 RefreshAllString 함수를 발견하고 숙고했을 것입니다. 그 신비한 결과. 이 문서의 목적은 특정 문자열에 적용할 때 생성되는 흥미로운 결과에 초점을 맞춰 RecreAllString의 내부 작동 방식을 조명하는 것입니다.

예제 사용법 및 놀라운 출력

다음 코드 조각을 고려해보세요.

<code class="go">re := regexp.MustCompile("a(x*)b")
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", ""))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "W"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "W"))</code>
로그인 후 복사
로그인 후 복사

첫 번째 줄의 예상 출력은 "-T-T-"입니다. 이는 "a(x*)b"의 모든 항목을 "T."로 대체하므로 의미가 있습니다. " 그러나 나머지 출력은 혼란스러울 수 있습니다.

--xx-
---
-W-xxW-
로그인 후 복사
로그인 후 복사

ReplaceAllString 함수 공개

이러한 출력 뒤에 숨은 미스터리를 풀려면 RecreAllString 함수의 구문을 자세히 살펴봐야 합니다. 및 동작:

<code class="go">func (re *Regexp) ReplaceAllString(src, repl string) string</code>
로그인 후 복사

이 함수는 두 개의 인수를 사용합니다:

  • src: 분석할 입력 문자열
  • repl: 사용할 대체 패턴

대체 패턴에서 $ 기호의 중요성

출력을 이해하는 열쇠는 함수가 대체 문자열에서 달러 기호($)를 해석하는 방법. Go 문서에 따르면 "$ 기호는 Expand에서와 같이 해석됩니다."

Expand 함수 및 그 의미

ReplaceAllString에서 참조되는 Expand 함수 문서, 추가 통찰력 제공:

  • $name: n번째 캡처 그룹이 캡처한 그룹으로 해석됩니다.
  • ${name}: 명명된 캡처 "name"에 의해 캡처된 그룹으로 해석됩니다.
  • 지정된 그룹이 존재하지 않거나 일치 중 초기화되지 않은 경우 빈 문자열이 사용됩니다.

출력 분석

이러한 지침에 따라 출력을 분석해 보겠습니다.

  • 출력 2: "$1"은 첫 번째 캡처 그룹인 "(x)"을 나타냅니다. "x"는 캡처되지 않았으므로 빈 문자열로 대체되어 "--xx-"가 됩니다.
  • 출력 3: "$1W"는 '1W'라는 그룹입니다. 그러나 해당 이름을 가진 명명된 캡처가 없기 때문에 빈 문자열이 사용되어 "---."
  • 출력 4: "${1}W"는 본질적으로 동일합니다. 중괄호가 대체 구문을 모호하게 한다는 점을 제외하면 "$1W"로 표시됩니다. 그럼에도 불구하고 여전히 빈 문자열 대체가 발생하여 "-W-xxW-"가 발생합니다.

이름이 지정된 캡처의 힘

출력의 일관성을 보장하기 위해 "?P..."으로 표시되는 명명된 캡처를 활용할 수 있습니다. 첫 번째 캡처 그룹의 이름을 바꾸면 "$1" 및 "${name}"이 캡처된 동일한 텍스트를 참조하도록 보장할 수 있습니다.

수정된 코드 및 예상 출력

<code class="go">re := regexp.MustCompile("a(x*)b")
fmt.Println(re.ReplaceAllString("-ab-axxb-", "T"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", ""))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "W"))
fmt.Println(re.ReplaceAllString("-ab-axxb-", "W"))</code>
로그인 후 복사
로그인 후 복사

예상 출력:

--xx-
---
-W-xxW-
로그인 후 복사
로그인 후 복사

결론

ReplaceAllString 구문의 뉘앙스와 대체 패턴에서 $ 기호의 역할을 이해함으로써 다음과 같은 이점을 얻을 수 있습니다. Go의 정규 표현식 패키지에 대해 더 깊은 감사를 드립니다. 이러한 지식을 통해 복잡한 문자열 조작 작업에 그 기능을 효과적으로 활용할 수 있습니다.

위 내용은 Go의 바꾸기AllString: 달러 기호가 왜 그렇게 이상하게 작동합니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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