분명히 |
(파이프?)를 사용하여을 나타낼 수 OR
있지만 표현 하는 방법이 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
.*
에 [\s\S]*
당신이 같은 새로운 라인이있는 경우 자바 스크립트에서 .
새로운 라인과 일치하지 않는 자바 스크립트의 정규식 엔진과 수정과를 만들 수 없습니다
이 예를보십시오 :
우리는 2 개의 정규 표현식 A와 B를 가지고 있으며 둘 다 일치시키기를 원하므로 의사 코드에서는 다음과 같습니다.
pattern = "/A AND B/"
AND 연산자를 사용하지 않고 다음과 같이 작성할 수 있습니다.
pattern = "/NOT (NOT A OR NOT B)/"
PCRE에서 :
"/(^(^A|^B))/"
regexp_match(pattern,data)
(?=expr)
그렇지 않았습니다. 구현에 의존하는 것 같습니다.
^
정규식 구문에서 "문자열의 시작"을 의미 하지 않습니까?
^
문자 클래스의 시작 부분에서만 부정입니다. CMake가 정말로 펑키 한 일을하지 않는 한 (패턴 일치 언어 "regex"를 호출하는 것이 오해의 소지가 있거나 잘못된 것으로 간주 될 수있는 시점까지) 나는 그것이 당신을 위해 일했다는 사실이 고립 된 사고라고 추측하고 있습니다.
정규 표현식으로 그렇게 할 수 있지만 아마도 다른 것을 원할 것입니다. 예를 들어 여러 정규 표현식을 사용하여 if 절에 결합하십시오.
다음과 같이 표준 정규 표현식을 사용하여 가능한 모든 순열을 열거 할 수 있습니다 (a, b 및 c는 순서에 관계없이).
(abc)|(bca)|(acb)|(bac)|(cab)|(cba)
그러나 용어가 두 개 이상인 경우 매우 길고 비효율적 인 정규 표현식이 만들어집니다.
Perl 또는 Java와 같은 확장 정규식 버전을 사용하는 경우 더 나은 방법이 있습니다. 다른 답변에서는 긍정적 인 미리보기 작업을 사용하는 것이 좋습니다.
a(bc|cb)|b(ac|ca)|c(ab|ba)
. 그리고 가장 중요한 것은 모든 정규식 맛과 함께 사용할 수 있습니다.
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) && ...
허용 된 답변 외에
나는 당신에게 어떤 것들을 더 명확하게 해줄 실용적인 예를 제공 할 것입니다. 예를 들어 세 줄의 텍스트가 있다고 가정 해 보겠습니다.
[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
순서는 항상 정규 표현식의 구조에 내포되어 있습니다. 원하는 것을 이루려면 입력 문자열을 다른 표현식과 여러 번 일치시켜야합니다.
단일 정규 표현식 으로 수행하려는 작업은 불가능 합니다.