[regex] 정규식 : AND 연산자가 있습니까?

분명히 |(파이프?)를 사용하여을 나타낼 수 OR있지만 표현 하는 방법이 AND있습니까?

특히 특정 문구가 모두 포함되어 있지만 특정 순서가 아닌 텍스트 단락을 일치시키고 싶습니다.



답변

소비하지 않는 정규식을 사용하십시오.

일반적인 (즉, Perl / Java) 표기법은 다음과 같습니다.

(?=expr)

이것은 “일치하는 expr 이지만 그 후에는 원래의 일치점에서 계속 일치합니다”를 의미합니다.

원하는만큼이 작업을 수행 할 수 있으며 이는 “and”가됩니다. 예:

(?=match this expression)(?=match this too)(?=oh, and this)

일부 데이터를 저장해야하는 경우 비소비 표현식 내에 캡처 그룹을 추가 할 수도 있습니다.


답변

다른 응답자가 말한 것처럼 lookahead를 사용해야하지만 lookahead는 대상 단어와 현재 일치 위치 사이의 다른 문자를 고려해야합니다. 예를 들면 다음과 같습니다.

(?=.*word1)(?=.*word2)(?=.*word3)

.*첫 내다보기에 그것은 그것 “단어 1″에 도달하기 전에 필요하지만 많은 문자와 일치 할 수 있습니다. 그런 다음 일치 위치가 재설정되고 두 번째 예측은 “word2″를 찾습니다. 다시 재설정하면 마지막 부분은 “word3″과 일치합니다. 그것은 당신이 확인하고있는 마지막 단어이므로, 미리보기에있을 필요는 없지만 아프지 않습니다.

전체 단락을 일치 시키려면 정규 표현식을 양쪽 끝에 고정하고 마지막 .*문자를 추가 하여 나머지 문자 를 사용해야합니다 . Perl 스타일 표기법을 사용하면 다음과 같습니다.

/^(?=.*word1)(?=.*word2)(?=.*word3).*$/m

‘m’수정자는 멀티 라인 모드 용입니다. 단락 경계 ( ^$정규 표현식에서 “라인 경계”)에서 및 일치를 허용합니다 . 이 경우 도트 메타 문자를 개행 및 다른 모든 문자와 일치시킬 수있는 ‘s’수정자를 사용 하지 않아야 합니다.

마지막으로, 더 긴 단어의 조각뿐만 아니라 전체 단어를 일치 시키려면 단어 경계를 추가해야합니다.

/^(?=.*\bword1\b)(?=.*\bword2\b)(?=.*\bword3\b).*$/m


답변

이 예를보십시오 :

우리는 2 개의 정규 표현식 A와 B를 가지고 있으며 둘 다 일치시키기를 원하므로 의사 코드에서는 다음과 같습니다.

pattern = "/A AND B/"

AND 연산자를 사용하지 않고 다음과 같이 작성할 수 있습니다.

pattern = "/NOT (NOT A OR NOT B)/"

PCRE에서 :

"/(^(^A|^B))/"

regexp_match(pattern,data)


답변

정규 표현식으로 그렇게 할 수 있지만 아마도 다른 것을 원할 것입니다. 예를 들어 여러 정규 표현식을 사용하여 if 절에 결합하십시오.

다음과 같이 표준 정규 표현식을 사용하여 가능한 모든 순열을 열거 할 수 있습니다 (a, b 및 c는 순서에 관계없이).

(abc)|(bca)|(acb)|(bac)|(cab)|(cba)

그러나 용어가 두 개 이상인 경우 매우 길고 비효율적 인 정규 표현식이 만들어집니다.

Perl 또는 Java와 같은 확장 정규식 버전을 사용하는 경우 더 나은 방법이 있습니다. 다른 답변에서는 긍정적 인 미리보기 작업을 사용하는 것이 좋습니다.


답변

AND 연산자는 RegExp 구문에 내재 되어 있습니다.
대신 OR 연산자를 파이프로 지정해야합니다.
다음 RegExp :

var re = /ab/;

문자 의미 a 편지를 b.
또한 그룹과 함께 작동합니다.

var re = /(co)(de)/;

이는 그룹 수단 co AND 그룹 de.
(암시 적) AND를 OR로 바꾸려면 다음 줄이 필요합니다.

var re = /a|b/;
var re = /(co)|(de)/;


답변

귀하의 경우 여러 일치하는 결과에 대해 AND를 수행 할 수 없습니까? 의사 코드로

regexp_match(pattern1, data) && regexp_match(pattern2, data) && ...


답변

왜 awk를 사용하지 않습니까?
awk 정규식 AND, OR 문제는 너무 간단합니다.

awk '/WORD1/ && /WORD2/ && /WORD3/' myfile