전체 문자열을 정규식과 어떻게 일치 시키나요?


82

전체 문자열이 내 쿼리와 일치하는 경우에만 일치하는 정규식이 필요합니다.

예를 들어 "Red October"라는 이름의 영화를 검색하는 경우 정확한 제목 (대소 문자 구분 안 함) 만 일치시키고 "The Hunt For Red October"와 같은 제목은 일치시키지 않습니다. 이 작업을 수행하는 방법을 잘 모르겠습니다. 아는 사람 있어요?

감사!


1
간단한 string.Contains작업을 위해 정규식이 필요한 이유는 무엇 입니까?
Oded

1
내가 정규식을 사용해야하는 이유는 MongoDB에서 검색을 위해 사용하고 있고 정규식으로 만 수행 할 수있는 대소 문자를 구분하지 않아야하기 때문입니다
Micah

검색을 위해 (즉시) db 데이터를 소문자 및 사용자 소문자 문자열로 변환하지 않는 이유는 무엇입니까?
greenoldman 2010

1
@macias 나는 그것이 더 나은 옵션이 될 것이라는 데 동의하지 않지만 불행히도 현재 상황은 그것을 허용하지 않습니다.
Micah

참고로, 만약이 두 문자열을 무시하는 경우를 비교하기 위해 노력하고, 정규식을 사용하여 필요로하지 않는, 간단하게 할 수있는string1.Equals(string2, StringComparison.OrdinalIgnoreCase);
ToolmakerSteve

답변:


110

다음 정규식을 시도하십시오.

^Red October$

기본적으로 정규식은 대소 문자를 구분합니다. ^에 표시된와는 일치하는 텍스트의 시작 $끝.


1
참고로 대소 문자를 구분하지 않으려면 regex 개체를 만들 때 두 번째 매개 변수 RegexOptions.IgnoreCase를 추가합니다.
ToolmakerSteve

해당 문자열 주변에 다른 것이 있으면 작동하지 않습니다. 예를 들어 Street에서와 같이 "St"를 검색했지만 동일한 줄에 "Stirling"이라는 이름과 같이 "St"로 시작하는 다른 문자열이있는 경우이 정규식은 정확히 일치하지 않습니다. 불행히도 RegEx가이 시나리오에 대한 올바른 답인지 잘 모르겠습니다. 그래도 계속 노력할 것입니다. 아래 Tim의 대답은 좋지만 모든 엔진이 이것을 지원하는 것은 아닙니다.
dyslexicanaboko

사실, $항상 문자열의 끝과 일치 \z하지는 않습니다. ( \Z는 파이썬에서 동일합니다). Tim Pietzcker의 답변을 참조하십시오 . 하지만 JavaScript에서는 사실입니다.
Wiktor Stribiżew

40

일반적으로 기본 설정 ^$앵커는 정규식이 전체 문자열과 일치하는지 확인하는 좋은 방법입니다.

하지만 몇 가지주의 사항 :

정규식에 대체가있는 경우 정규식을 ^and로 둘러싸 기 전에 비 캡처 그룹으로 묶어야합니다 $.

^foo|bar$

물론 다릅니다

^(?:foo|bar)$

또한, ^$(/ 끝 시작 다른 의미에 걸릴 수 있습니다 라인 대신의 시작 / 끝의 문자열을 특정 옵션이 설정되어있는 경우). 정규식을 지원하는 텍스트 편집기에서는 일반적으로 이것이 기본 동작입니다. 일부 언어, 특히 Ruby에서는이 동작을 끌 수도 없습니다.

따라서 전체 문자열의 시작 / 끝에서만 일치하도록 보장되는 또 다른 앵커 세트가 있습니다.

\A 문자열의 시작 부분과 일치합니다.

\Z 문자열의 끝이나 마지막 줄 바꿈 전에 일치합니다.

\z 문자열의 맨 끝에 일치합니다.

그러나 모든 언어가 이러한 앵커, 특히 JavaScript를 지원하는 것은 아닙니다.


4
이것은 가장 유용한 답변입니다
제레미 Danyow

18

^$수정자를 사용하여 정규식 패턴이 문자열의 시작과 끝을 기준으로 배치되는 위치를 나타냅니다.

Regex.Match("Red October", "^Red October$"); // pass
Regex.Match("The Hunt for Red October", "^Red October$"); // fail

10

이 질문에 답하기에는 조금 늦을 수 있지만 다른 사람에게는 유용 할 수 있습니다.

가장 간단한 방법 :

var someString = "...";
var someRegex = "...";
var match = Regex.Match(someString , someRegex );
if(match.Success && match.Value.Length == someString.Length){
    //pass
} else {
    //fail
}

2
IMHO 이것은 허용되는 대답보다 덜 간단합니다. 그러나 그것은 대안입니다.
ToolmakerSteve

코드 자체가 정규식을 수정하는 대신 의도 된 동작을 보여주기 때문에이 답변을 좋아합니다 (정규식을 거의 이해하지 못하는 사람에게는 명확하지 않을 수 있음). 잠재적 인 문제는 완전한 일치가 가능하더라도 Regex.Match 함수가 부분 일치를 반환하여 전체 문자열 또는 일부와 일치하도록 정규 표현식을 작성할 수 있다는 것입니다.
John Thoits


0

미안하지만 약간 불분명합니다.

내가 읽은 것에서 간단한 문자열 비교를 원합니다. 이를 위해 정규식이 필요하지 않습니다.

string myTest = "Red October";
bool isMatch = (myTest.ToLower() == "Red October".ToLower());
Console.WriteLine(isMatch);
isMatch = (myTest.ToLower() == "The Hunt for Red October".ToLower());

1
정규식을 사용해야하는 이유는 MongoDB에서 검색을 위해 사용하고 있고 정규식으로 만 수행 할 수있는 대소 문자를 구분하지 않아야하기 때문입니다.
Micah

-1

문자열에서 문자 마이너스 a를 한 번만 잡으려면 myRegex.IsMatch ()로 확인할 수 있습니다.

^ [^ e] [e] {1} [^ e] $

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