임의의 순서로 두 이름을 포함하는 문자열과 일치하는 정규식


180

정규식에 논리 AND가 필요합니다.

같은

잭 앤드 제임스

다음 문자열에 동의

  • ' 여기 제임스입니다 '

  • '여 보세요 제임스잭입니다 '



@AndersonGreen, 질문이 조기에 잠겼습니다. 대부분의 정규 표현식이 둘러보기모드 수량 자를 인식하지 못하기 때문에 이러한 솔루션을 사용할 수 없으므로 답변이 심각하지 않습니다 . 나는 질문이 제기되는 시점에 정량자가 존재 했다고 생각 합니다.
XPMai

답변:


261

lookarounds를 사용하여 점검 할 수 있습니다 .

^(?=.*\bjack\b)(?=.*\bjames\b).*$

그것을 테스트하십시오.

이 방법은 여러 조건을 쉽게 지정할 수 있다는 장점이 있습니다.

^(?=.*\bjack\b)(?=.*\bjames\b)(?=.*\bjason\b)(?=.*\bjules\b).*$

18
이 예제가 어떻게 작동하는지 조금 더 자세히 설명해 주시겠습니까?
bjmc

2
vim문법 : ^\(.*\<jack\>\)\@=\(.*\<james\>\@=\).*$또는\v^(.*<jack>)@=(.*<james>)@=.*$
mykhal

'#'으로 시작하는 문자열을 검색하려고 할 때 왜 이것이 JavaScript에서 깨지는 지 아는 사람이 있습니까? ^(?=.*\b#friday\b)(?=.*\b#tgif\b).*$일치 blah #tgif blah #friday blah하지 않지만 제대로 ^(?=.*\bfriday\b)(?=.*\btgif\b).*$작동합니다.
btleffler

2
여기서 무엇을 \b의미합니까?
VarunAgw


106

시험:

james.*jack

두 가지를 동시에 원하면 다음과 같이하십시오 or.

james.*jack|jack.*james

1
수락 된 답변이 효과가있었습니다. 이것은 또한 나를 위해 완벽하게 작동했습니다. Visual Studio '결과 찾기'에서 코드를 검색합니다.
Yogurt The Wise

1
이것은 나를 위해 작동하며 허용 된 답변보다 훨씬 간결하고 이해하기 쉽습니다!
Kumar Manish

1
일치하는 이름이 두 개 뿐인 솔루션이 필요했기 때문에이 답변이 더 간결합니다. 그러나 "또는"의 수가 요인 적으로 증가하기 때문에 허용 된 대답은 2보다 더 간결 해집니다. 이름이 3 개인 경우 6 "또는", 4 명의 이름은 24 "또는"등이됩니다.
WileCau

게으른 게 좋습니다 james.*?jack|jack.*?james. 큰 텍스트에 도움이됩니다.
Jekis

42

내가 쓸 명령에 대한 설명 :-

. 모든 문자, 숫자 대신 자리가 올 수 있음을 의미합니다.

* 바로 앞에 쓰여진 것 이상의 0을 의미합니다.

|'또는'을 의미합니다 .

그래서,

james.*jack

을 검색 james 한 다음에 jack올 때까지 모든 문자를 검색 합니다.

때문에 당신이 원하는 하나 jack.*james또는james.*jack

따라서 명령 :

jack.*james|james.*jack

7
참고로-@icyrock의 답변 (6 년 전과 동일)을 편집 할 수도 있었으므로 설명은 그 자체로 매우 유용합니다.
WoJ

2
이 답변에 감사드립니다. 그러나 VSCode 검색에서 응답 을 지적 할 필요가 있다고 생각 합니다. * james | james. * jack 은 '|'사이에 공백을 갖습니다. (또는) 검색 중에 고려할 기호. jack. * james | james. * jack가 작동하고 공간을 찾지 않습니다
jgritten

2
IF $ _explanation === "awesome"이면 $ THUMBS_UP ENDIF를 반환합니다.
Syed Aqeel



2

Vim에는 지점 운영자가 있습니다 \& 어떤 순서로든 단어 집합을 포함하는 줄을 검색 할 때 유용한 를 있습니다. 또한 필요한 단어 세트를 확장하는 것은 쉽지 않습니다.

예를 들어

/.*jack\&.*james

및를 포함하는 행 jackjames순서에 관계없이 일치합니다 .

사용법에 대한 자세한 내용 은 이 답변 을 참조하십시오 . 나는 분기를 구현하는 다른 정규식 맛을 모른다. 연산자는 정규식 위키 백과 항목 에도 문서화되어 있지 않습니다 .


2

방법 1 : 하나 jack와 하나james

이런 경우에,이 jack두는 james하나, 허용되지 않을 것이라고 jackjames유효 할 것이다, 우리는 가능성이 유사한 표현으로 디자인 할 수 있습니다 :

^(?!.*\bjack\b.*\bjack\b)(?!.*\bjames\b.*\bjames\b)(?=.*\bjames\b)(?=.*\bjack\b).*$

여기서는 다음 명령문을 사용하여 해당 쌍 인스턴스를 제외합니다.

(?!.*\bjack\b.*\bjack\b)

과,

(?!.*\bjames\b.*\bjames\b)

정규식 데모 1

또한이를 단순화 할 수 있습니다.

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$

정규식 데모 2


표현식을 단순화 / 수정 / 탐색하려면 regex101.com의 오른쪽 상단에 설명되어 있습니다. 원하는 경우이 링크 에서 일부 샘플 입력과 어떻게 일치하는지 확인할 수도 있습니다.


정규식 회로

jex.im은 정규 표현식을 시각화합니다.

여기에 이미지 설명을 입력하십시오

테스트

const regex = /^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b|.*\bjack\b).*$/gm;
const str = `hi jack here is james
hi james here is jack
hi james jack here is jack james
hi jack james here is james jack
hi jack jack here is jack james
hi james james here is james jack
hi jack jack jack here is james
`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}


방법 2 : 특정 순서로 jack하나씩james

그것은 또한 첫째을 위해 설계 될 수있다 james마지막으로 jack, 하나를 다음과 같은 :

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjames\b.*\bjack\b).*$

정규식 데모 3

그 반대:

^(?!.*\bjack\b.*\bjack\b|.*\bjames\b.*\bjames\b)(?=.*\bjack\b.*\bjames\b).*$

정규식 데모 4


0

항상 지원되지 않을 수 있으므로 정규식의 한정자 기능 을 사용할 수 있습니다 lookaround.

(\b(james|jack)\b.*){2,}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.