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


708

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

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


1
텍스트에서 구를 찾고 싶습니까? 각 구가 주어진 구의 단어를 올바르게 치환 한 것입니까?
Nietzche-jou

2
3-4 개의 대답이 무시하기 때문에 이것을 여기에 올려 놓았습니다. Lookahead는 $로 끝나지 않는 한 각 절의 길이가 동일하지 않습니다. 예를 들어, (? = a *) (? = aab)는 aabaaaaba와 일치합니다.
Zachary Vance

2
"AND"연산자에 "공백"문자 만 사용하십시오.

1 I'd like to match paragraphs of text.. 2. 비 순차적 텍스트를 포함합니다. 1 번은 해석에 개방되어 있습니다. 숫자 2는 몇 가지 방법으로 수행 할 수 있습니다. 방법 1 : (?:(?:(?(1)(?!))\b(phrase1)\b.*?|(?(2)(?!))\b(phrase2)\b.*?)){2}, 방법 2 : (?=.*\bphrase1\b)(?=.*\bphrase2\b)이 경우 단락 정의가 공식화 될 때까지이 경우 단락의 일치가 정의되지 않습니다.

답변:


385

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

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

(?=expr)

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

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

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

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


3
perl -e "q {some stuff and things} = ~ / (? = some) (? = stuff) (? = things) /? print 'yes': print 'no'"는 'no'를 인쇄합니다.
Robert P

27
이 특정 예를 긍정적 인 예측 어설 션이라고합니다. "and"이외의 용도가 있습니다. 텍스트는 소비되지 않습니다.
strager

7
이와 같이 (? =)를 사용하면 절대 성공할 수없는 정규식이 만들어집니다. 그러나 그것은 이다 |에 함께 아날로그은. OP는 자신의 문제를 해결할 것이라고 생각하는 것이 잘못되었습니다.
Nietzche-jou

10
perl -e "q {some stuff and things} = ~ /(?=.*some)(?=.*stuff)(?=.*things)/? print 'yes': print 'no'"
kriss

3
답변에 펄 코드로 쉬운 예제를 추가 할 수 있습니까?
Pithikos

343

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

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

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

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

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

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

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

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

8
정확히 맞습니다-이것에 대한 튜토리얼도 있습니다! ocpsoft.org/tutorials/regular-expressions/and-in-regex
Lincoln

9
고마워요. * 이것은 차이를 만듭니다
Gennadiy Ryabkin

1
암호의 백분율 일치 비율을 계산하기위한 핵과 같은 용도와 달리, 예측에 가장 적합한 용도 중 하나를 나타내는 명확하고 간결한 답변의 경우 +1입니다. :)
zx81

1
@ 리암 :. MySQL은 POSIX ERE 특징을 사용합니다. 성능에 유리한 기능을 효과적으로 희생합니다. 자세한 정보는 여기에 있습니다 .
Alan Moore

3
대신 .*[\s\S]*당신이 같은 새로운 라인이있는 경우 자바 스크립트에서 .새로운 라인과 일치하지 않는 자바 스크립트의 정규식 엔진과 수정과를 만들 수 없습니다
웨슬리 스미스

41

이 예를보십시오 :

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

pattern = "/A AND B/"

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

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

PCRE에서 :

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

regexp_match(pattern,data)

24
공식적인 논리에 있어서는 사실이지만 여기서는 전혀 도움이되지 않습니다. 정규 표현식에서 AND는 AND보다 표현하기가 훨씬 어려울 수 있습니다.
Alan Moore

@marvin_dpr CMake에서 나를 위해 일했지만 다른 제안은 (?=expr)그렇지 않았습니다. 구현에 의존하는 것 같습니다.
Melebius

38
^정규식 구문에서 "문자열의 시작"을 의미 하지 않습니까?
Lambda Fairy

3
일반적으로 정규 표현식에서는 ^문자 클래스의 시작 부분에서만 부정입니다. CMake가 정말로 펑키 한 일을하지 않는 한 (패턴 일치 언어 "regex"를 호출하는 것이 오해의 소지가 있거나 잘못된 것으로 간주 될 수있는 시점까지) 나는 그것이 당신을 위해 일했다는 사실이 고립 된 사고라고 추측하고 있습니다.
tripleee 2019

29

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

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

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

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

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


10
귀하의 접근 방식이 3 가지 예측보다 비효율적이라고 생각하지 않습니다. 쓰기 시간이 더 길지만 패턴을 자동으로 쉽게 생성 할 수 있습니다. 로 더 빨리 실패하도록 개선 할 수 있습니다 a(bc|cb)|b(ac|ca)|c(ab|ba). 그리고 가장 중요한 것은 모든 정규식 맛과 함께 사용할 수 있습니다.
Casimir et Hippolyte 2016 년

27

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)/;

29
불행히도 이것은 OP가 요구 한 것이 아닙니다. 순서대로 원하는 것을 찾는 반면 순서대로 원하는 것을 찾습니다. 아래의 stackoverflow.com/users/20938/alan-moore 의 답변을 확인하십시오 .
JESii

1
@JESii 귀하의 요점에 감사드립니다, 당신은 옳고 Hugoware의 질문을 오해했습니다. 특히 그의 첫 문장에 집중했습니다. AlanMoore가 쓴 것처럼 정답은 lookahead 연산자를 올바르게 사용하는 것입니다. 어쨌든 나는 누군가가 내 설명이 유용하다고 생각할 것입니다. 이미 공표 된 것처럼 모든 것을 버리지 않을 것입니다. 문안 인사.
Emanuele Del Grande

13

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

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

3
규칙의 유효성을 테스트하기 위해 단일 정규식 패턴 일치 문자열이있는 규칙의 데이터 테이블 인 코드가있는 상황에 처해 있습니다. 여러 테스트로 이동하는 것은 필자의 경우에는 할 수있는 일이 아니며 일반적으로 다른 사람들의 경우에서도 할 수있는 일이 아닙니다!
Alan Wolfe

11

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

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

9

Perl 정규식을 사용하는 경우 긍정적 인 예측을 사용할 수 있습니다.

예를 들어

(?=[1-9][0-9]{2})[0-9]*[05]\b

100보다 크고 5로 나눌 수있는 숫자


8

출력을 다른 정규식으로 파이프 할 수 있습니다. grep을 사용하면 다음과 같이 할 수 있습니다.

grep A | grep B


8

허용 된 답변 외에

나는 당신에게 어떤 것들을 더 명확하게 해줄 실용적인 예를 제공 할 것입니다. 예를 들어 세 줄의 텍스트가 있다고 가정 해 보겠습니다.

[12/Oct/2015:00:37:29 +0200] // only this + will get selected
[12/Oct/2015:00:37:x9 +0200]
[12/Oct/2015:00:37:29 +020x]

여기 데모를 참조하십시오 DEMO

여기서 우리가하고 싶은 것은 + 기호를 선택하는 것입니다. 공백이있는 두 개의 숫자 뒤에 있고 네 개의 숫자 앞에있는 경우에만 가능합니다. 이것 만이 유일한 제약입니다. 이 정규 표현식을 사용하여 달성합니다.

'~(?<=\d{2} )\+(?=\d{4})~g'

식을 분리하면 다른 결과가 나타납니다.

또는 태그 사이에서 일부 텍스트를 선택하고 싶을 수도 있지만 태그는 아닙니다! 그런 다음 사용할 수 있습니다.

'~(?<=<p>).*?(?=<\/p>)~g'

이 텍스트의 경우 :

<p>Hello !</p> <p>I wont select tags! Only text with in</p> 

여기 데모를 참조하십시오 DEMO


어떤 대답이 받아 들여졌습니까? 나중에 나에게 링크를 추가하십시오.
James Brown

6

순서는 항상 정규 표현식의 구조에 내포되어 있습니다. 원하는 것을 이루려면 입력 문자열을 다른 표현식과 여러 번 일치시켜야합니다.

단일 정규 표현식 으로 수행하려는 작업은 불가능 합니다.


기술적으로 불가능하지는 않지만 구현할 가치는 없습니다. 나는 왜 누군가가 downvoted했는지 모르겠다.
Robert P

13
아마도 가능할뿐만 아니라 정규 표현식이 미리보기를 지원한다고 가정하면 간단합니다. 그리고 그것은 좋은 내기입니다. 오늘날의 주요 프로그래밍 언어는 대부분이를 지원합니다.
Alan Moore

3

정규식 밖에서 AND를 사용하십시오. PHP lookahead 연산자가 나를 위해 작동하지 않는 것 대신에 이것을 사용했습니다.

if( preg_match("/^.{3,}$/",$pass1) && !preg_match("/\s{1}/",$pass1))
    return true;
else
    return false;

암호 길이가 3 자 이상이고 암호에 공백이 없으면 위의 정규식이 일치합니다.

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