AND / OR 연산자는 정규식에서 어떻게 표현됩니까?


220

현재 사용자가 단어를 올바르게 입력했는지 확인하는 어휘 알고리즘을 프로그래밍 중입니다. 다음과 같은 상황이 있습니다. 단어에 대한 올바른 해결책은 "part1, part2"입니다. 사용자는 "part1"(답변 1), "part2"(답변 2) 또는 "part1, part2"(답변 3)를 입력 할 수 있어야합니다. 이제 사용자가 제공 한 문자열을 다음과 같이 자동으로 생성 된 정규식과 일치 시키려고합니다.

^(part1|part2)$

이것은 답변 1과 2만을 정확한 것으로 반환하지만 답변 3은 틀릴 것입니다. 나는 지금 비슷한 연산자가 있는지 궁금합니다. | 그 and/or대신에 말합니다 either...or.

누구 든지이 문제를 해결하도록 도울 수 있습니까?


1
정규 표현식은 이에 대한 최상의 솔루션이 아닐 수도 있습니다. 일반적인 문자열 방법을 사용합니다.
Felix Kling

3
이 문제는 잘못 지정되었습니다. 필요한 문자열 집합에 대한 정확한 문자열 비교만으로 패턴 일치를 사용하는 이유는 무엇입니까? 정규식 컴파일러가 Perl과 같은 방식으로 O (1) trie 구조로 대안을 최적화하지 않는 한, 대신 해시 멤버쉽에 대한 테스트를 수행해야합니다. 다른 정규식 엔진은 이것에 매우 영리하지 않습니다.
tchrist

@tchrist 유스 케이스는 MongoDB의의가 될 수 $or정규식 일치
디르 압바스

답변:


284

part1과 part2가 아닌 다른 단어를 포함하도록 동적으로 정규식을 작성하고 순서는 중요하지 않다고 가정합니다. 그렇다면 다음과 같이 사용할 수 있습니다.

((^|, )(part1|part2|part3))+$

긍정적 인 일치 :

part1
part2, part1
part1, part2, part3

제외 어 일치 :

part1,           //with and without trailing spaces.
part3, part2, 
otherpart1

4
"part1, part"1도 양수입니다. 어떤 항상 바람직하지 않다
dimaaan

1
@dimaaan 당신은 당신의 따옴표를 잘못 배치 했습니까? "part1, part1"은 일치하지만 "part1, part"는 일치하지 않습니다. 테스트 시나리오가 어휘의 단어로 구성되어 있는지 확인하는 OP를 적용하기 위해 이러한 시나리오가 해당 솔루션에 포함되지 않는다는 것이 맞지만, 단어가있을 때에도 긍정적 인 일치를 원한다고 생각합니다 반복했다. 당신이 가진 단어의 수에 관계없이 단어는 여전히 어휘의 일부가 될 것입니다.
Gaute Løken

30
'^(part1|part2|part1,part2)$'

작동합니까?


1
명백하게. 정규 표현식은 전체 문자열이 일치해야합니다 (^, $)
glasspill

5

이 변경없이 작동합니까?

^((part)1(, \22)?)?(part2)?$

아니면 왜 그렇지 않습니까?

^((part)1(, (\22))?)?(\4)?$

첫 번째는 모든 조건에서 작동하며 두 번째는 모두 제외하고 part2(GNU sed 4.1.5 사용)


4

정규식 전문가는 아니지만 할 수 있습니다 ^((part1|part2)|(part1, part2))$. "파트 1 또는 파트 2 또는 둘 다"


2

또는 이것을 사용할 수 있습니다 :

^(?:part[12]|(part)1,\12)$
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.