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

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

같은

잭 앤드 제임스

다음 문자열에 동의

  • ‘ 여기 제임스입니다

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



답변

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

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

그것을 테스트하십시오.

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

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


답변

시험:

james.*jack

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

james.*jack|jack.*james


답변

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

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

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

|‘또는’을 의미합니다 .

그래서,

james.*jack

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

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

따라서 명령 :

jack.*james|james.*jack


답변

짧고 달콤한

(?=.*jack)(?=.*james)


답변

넌 할 수있어:

\bjack\b.*\bjames\b|\bjames\b.*\bjack\b


답변

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

예를 들어

/.*jack\&.*james

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

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


답변

방법 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