Programing

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

crosscheck 2020. 8. 31. 07:15
반응형

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


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

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

fooFOOfOoFoOBARBARbarbarbAr

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

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

편집하다

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

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

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

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

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

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


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

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

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

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

출처


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


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


당신은 사용할 수 있습니다

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

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

참고 URL : https://stackoverflow.com/questions/43632/can-you-make-just-part-of-a-regex-case-insensitive

반응형