정규식의 일부만 대소 문자를 구분하지 않게 만들 수 있습니까?


100

전체 정규식을 대소 문자를 구분하지 않는 예제를 많이 보았습니다. 내가 궁금한 것은 표현식의 일부만 대소 문자를 구분하지 않는 것입니다.

예를 들어 다음과 같은 문자열이 있다고 가정 해 보겠습니다.

fooFOOfOoFoOBARBARbarbarbAr

대소 문자에 관계없이 "foo"의 모든 항목을 일치시키고 싶지만 대문자 "BAR"만 일치 시키려면 어떻게해야합니까?

이상적인 솔루션은 정규식 풍미에서 작동하는 것이지만 언어 별 풍미도 듣는 데 관심이 있습니다 ( Espo 에게 감사 드립니다 )

편집하다

Espo가 제공 한 링크는 매우 도움이되었습니다. 표현식 내에서 수정자를 켜고 끄는 것에 대한 좋은 예가 있습니다.

내 인위적인 예의 경우 다음과 같이 할 수 있습니다.

(?i)foo*(?-i)|BAR

일치하는 foo 부분에 대해서만 대소 문자를 구분하지 않습니다.

Javascript, Python 및 기타 몇 가지를 제외한 대부분의 정규식 구현에서 작동하는 것처럼 보였습니다 (Espo가 언급했듯이).

내가 궁금했던 큰 것 (Perl, PHP, .NET)은 모두 인라인 모드 변경을 지원합니다.


이 질문은 "Modifiers"아래 의 Stack Overflow Regular Expression FAQ 에 추가되었습니다 .
aliteralmind 2014

답변:


88

Perl을 사용하면 (? i :) 패턴 수정자를 사용하여 정규식의 일부를 대소 문자를 구분하지 않습니다.

최신 정규식 버전을 사용하면 정규식의 일부에만 수정자를 적용 할 수 있습니다. 정규식 중간에 수정 자 (? ism)를 삽입하면 수정자는 수정 자 오른쪽에있는 정규식 부분에만 적용됩니다. 마이너스 기호를 앞에 붙여 모드를 끌 수 있습니다. 빼기 기호 이후의 모든 모드가 꺼집니다. 예 : (? i-sm)은 대소 문자를 구분하지 않고 단일 라인 모드와 다중 라인 모드를 모두 끕니다.

모든 정규식 버전이이를 지원하는 것은 아닙니다. JavaScript와 Python은 모든 모드 수정자를 전체 정규 표현식에 적용합니다. 모드 수정자가 전체 정규식에 적용될 때 옵션을 끄는 것은 의미가 없기 때문에 (? -ismx) 구문을 지원하지 않습니다. 모든 옵션은 기본적으로 꺼져 있습니다.

사용중인 정규식 버전이 모드 수정자를 처리하는 방법을 빠르게 테스트 할 수 있습니다. 정규식 (? i) te (?-i) st는 test 및 TEst와 일치해야하지만 teST 또는 TEST는 일치하지 않아야합니다.

출처


6

어떤 언어를 사용하고 있습니까? 이를 수행하는 표준 방법은 대소 문자 구분이 설정된 / ([Ff] [Oo] {2} | BAR) /와 같지만 Java에는 예를 들어 대소 문자 구분 수정 자 (? i)가 있습니다. 오른쪽의 문자는 대소 문자를 구분하지 않으며 (? -i) 민감도를 강제합니다. Java 정규식 수정 자의 예는 여기 에서 찾을 수 있습니다 .


+1 두 케이스를 일치시킬 수 있는데 왜 대소 문자를 구분하지
않는지

11
@NonaUrbiz : 표현 (?i)foobar이 더 읽기 쉽기 때문에[Ff][Oo]{2}[Bb][Aa][Rr]
Thanatos

1
그리고 그것은 성장할 수 있기 때문에 방법이 훨씬 더 털이 복잡한.
Chop

6

불행히도 대소 문자를 구분하지 않는 일치 구문은 일반적이지 않습니다. .NET에서는 RegexOptions.IgnoreCase 플래그 또는 ? i 수정자를 사용할 수 있습니다.


4

당신은 사용할 수 있습니다

(?:F|f)(?:O|o)(?:O|o)

.Net의 괄호 안에있는? :는 캡처되지 않음을 의미하며 | (또는) 진술.


26
"[fF] [oO] [oO]"가 더 나은 대안이 아닙니까? 예를 들어 "[fF] [oO] \ {2}"까지 갈 수도 있습니다. ;-)
Tomalak

4

정규식의 일부에 대해서만 모드 켜기 및 끄기에 설명 된대로 인라인 수정 자에 의존 할 수 있다는 것은 사실입니다 .

정규식 (?i)te(?-i)st은 test 및와 일치해야 TEst하지만 teST또는 와는 일치 하지 않아야 TEST합니다.

그러나 조금 더 지원되는 기능은 (?i:...)인라인 수정 자 그룹입니다 ( 수정 자 범위 참조 ). 구문은 (?i:, 대소 문자를 구분하지 않으려는 패턴, ).

(?i:foo)|BAR

: 당신의 패턴이 대소 문자 구분 옵션을 사용하여 컴파일하고 정규식 케이스의 일부가 민감해야 할 경우, 당신은 추가 -?: (?-i:...).

다양한 언어로 사용되는 예 (각괄호로 일치 항목을 래핑) :

  • - preg_replace("~(?i:foo)|BAR~", '<$0>', "fooFOOfOoFoOBARBARbarbarbAr")( 데모 )
  • - re.sub(r'(?i:foo)|BAR', r'<\g<0>>', 'fooFOOfOoFoOBARBARbarbarbAr')( 데모 ) (주 파이썬 re지원은 파이썬 3.6 이후 수정 그룹을 인라인)
  • / / - Regex.Replace("fooFOOfOoFoOBARBARbarbarbAr", "(?i:foo)|BAR", "<$&>")( 데모 )
  • - "fooFOOfOoFoOBARBARbarbarbAr".replaceAll("(?i:foo)|BAR", "<$0>")( 데모 )
  • - $s =~ s/(?i:foo)|BAR/<$&>/g( 데모 )
  • - "fooFOOfOoFoOBARBARbarbarbAr".gsub(/(?i:foo)|BAR/, '<\0>')( 데모 )
  • - gsub("((?i:foo)|BAR)", "<\\1>", "fooFOOfOoFoOBARBARbarbarbAr", perl=TRUE)( 데모 )
  • - "fooFOOfOoFoOBARBARbarbarbAr".replacingOccurrences(of: "(?i:foo)|BAR", with: "<$0>", options: [.regularExpression])
  • -(RE2 사용)- regexp.MustCompile(`(?i:foo)|BAR`).ReplaceAllString( "fooFOOfOoFoOBARBARbarbarbAr", `<${0}>`)( 데모 )

지원되지 않음 , , , std::regex, , .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.