Go에서 대소 문자를 구분하지 않는 정규 표현식을 어떻게 수행합니까?


84

이제 물론,와 같은 두 경우를 모두 처리하는 정규식을 작성할 수 regexp.Compile("[a-zA-Z]")있지만 정규식은 사용자가 지정한 문자열로 구성됩니다.

reg, err := regexp.Compile(strings.Replace(s.Name, " ", "[ \\._-]", -1))

s.Name이름은 어디에 있습니까 ? 'North by Northwest'와 같을 수 있습니다. 이제 가장 분명한 해결책은의 각 문자를 살펴보고 각 문자에 대해 s.Name'[nN]'을 쓰는 것입니다.

for i := 0; i < len(s.Name); i++ {
  if s.Name[i] == " " {
    fmt.Fprintf(str, "%s[ \\._-]", str);
  } else {
    fmt.Fprintf(str, "%s[%s%s]", str, strings.ToLower(s.Name[i]), strings.ToUpper(s.Name[i]))
  }
}

그러나 나는 이것이 다소 우아하지 않은 해결책이라고 생각합니다. 속도는 실제로 문제가되지 않지만 다른 방법이 있는지 알아야합니다.

답변:


171

정규식의 첫 번째 항목으로 대소 문자를 구분하지 않는 플래그를 설정할 수 있습니다.

"(?i)"정규식의 시작 부분 에 추가 하여 이를 수행합니다 .

reg, err := regexp.Compile("(?i)"+strings.Replace(s.Name, " ", "[ \\._-]", -1))

고정 정규식의 경우 다음과 같습니다.

r := regexp.MustCompile(`(?i)CaSe`)

플래그에 대한 자세한 내용은 regexp/syntax패키지 문서 (또는 구문 문서 )에서 "flags"라는 용어를 검색하십시오 .


4
하지만 데이터가 많을 때 너무 느립니다. regexp.Match에서 unicode.SimpleFold를 호출하기 때문에 문자를 대문자로 변경 한 다음 regexp를 사용하여 일치시키는 것이 좋습니다. 이것은 속도입니다. 다음은 시간 데이터입니다.```#By (? i) 대소 문자 무시 정규 표현식 XCMP / bin / otacmp -o BSP_2.2.0.html -f BSP / frameworks -f Code / frameworks 1271.94s user 7.32s system 97 % cpu 21 : 54.95 총 #By TOUPPER와 일치 XCMP / 빈 / otacmp -o BSP_2.2.0.html -f BSP / 프레임 워크 -f 코드 / 프레임 워크 263.87s 사용자 8.99s 시스템 110 %의 CPU 4 : 06.44 총```
QJGui

1
대소 문자를 구분하지 않는 regexp의 느린 성능은 다음 달에 수정 된 알려진 버그 인 것 같습니다. github.com/golang/go/issues/13288
Dan Esparza

29

(?i)패턴의 시작 부분에를 추가하여 대소 문자를 구분하지 않을 수 있습니다 .

참고



4

i플래그를 사용하십시오 . 팁 문서 인용 :

그룹화 :

(re)           numbered capturing group
(?P<name>re)   named & numbered capturing group
(?:re)         non-capturing group
(?flags)       set flags within current group; non-capturing
(?flags:re)    set flags during re; non-capturing

플래그 구문은 xyz (set) 또는 -xyz (clear) 또는 xy-z (set xy, clear z)입니다. 플래그는 다음과 같습니다.

i              case-insensitive (default false)
m              multi-line mode: ^ and $ match begin/end line in addition to begin/end text (default false)
s              let . match \n (default false)
U              ungreedy: swap meaning of x* and x*?, x+ and x+?, etc (default false)

22
코드에서 i, m, s 및 U를 어디에 넣어야합니까?
Qian Chen

25
이 답변은 문서만큼 유용하지 않습니다. 고맙게도 아래에 작동하는 예제가 있습니다.
laurent
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.