[regex] 정규식-특정 패턴을 제외한 모든 것을 일치시키는 방법

특정 패턴을 충족하지 않는 문자열과 일치하도록 정규식을 작성하는 방법은 무엇입니까? 나는 (A와 ~ B) 패턴과 일치 해야하는 상황에 직면 해 있습니다.



답변

미리보기 어설 션을 사용할 수 있습니다.

(?!999)\d{3}

이 예는 이외의 세 자리 숫자와 일치 999합니다.


그러나이 기능을 사용하여 정규식 구현을하지 않는 경우 ( 정규식 플레이버 비교 참조 ) 자체적으로 기본 기능을 사용하여 정규식을 작성해야합니다.

기본 구문 만있는 호환 가능한 정규식은 다음과 같습니다.

[0-8]\d\d|\d[0-8]\d|\d\d[0-8]

이것도 아닌 세 자리 시퀀스와 일치합니다 999.


답변

문자열에서 단어 A를 일치시키고 단어 B를 일치시키지 않으려는 경우 예를 들면 다음과 같습니다. 텍스트가있는 경우 :

1. I have a two pets - dog and a cat
2. I have a pet - dog

당신은 텍스트 행을 검색하려면 개를 가질 애완 동물과 고양이가없는 이 정규 표현식을 사용할 수 있습니다 :

^(?=.*?\bdog\b)((?!cat).)*$

두 번째 줄만 찾습니다.

2. I have a pet - dog


답변

패턴과 일치하고 호스트 언어를 사용하여 일치의 부울 결과를 반전시킵니다. 이것은 훨씬 더 읽기 쉽고 유지 보수가 쉬울 것입니다.


답변

언급되지 않은 간단한 해결책이 있었기 때문에이 고대의 질문을 부활시키는 것은 아닙니다. ( 정규 현상금 퀘스트를 조사하는 동안 질문을 찾았습니다 .)

나는 (A와 ~ B) 패턴과 일치 해야하는 상황에 직면 해 있습니다.

이를위한 기본 정규식은 매우 간단합니다. B|(A)

전체 경기를 무시하고 A가 포함될 그룹 1 캡처를 조사하십시오.

예 (정규식에서 html 파싱에 대한 모든 면책 조항 포함) : A는 숫자, B는 안의 숫자 <a tag

정규식 : <a.*?<\/a>|(\d+)

데모 (오른쪽 아래 창에서 그룹 1을보십시오)

참고

상황 s1, s2, s3을 제외하고 패턴을 일치시키는 방법

다음과 같은 경우를 제외하고 패턴을 일치시키는 방법 …


답변

정규 언어의 보완은 정규 언어이지만이를 구성 하려면 정규 언어에 대한 DFA 를 작성하고 유효한 상태를 오류로 변경해야합니다. 예를 보려면 이것을 참조하십시오 . 어떤 페이지가 말을하지 않는 것은 변환이다 /(ac|bd)//(a[^c]?|b[^d]?|[^ab])/. DFA에서 정규 표현식으로 다시 변환하는 것은 쉽지 않습니다. 이전에 제안한 것처럼 정규식을 변경하지 않고 코드의 의미를 변경할 수 있으면 더 쉽습니다.


답변

패턴-다시

str.split(/re/g) 

패턴을 제외한 모든 것을 반환합니다.

여기서 테스트


답변

내 대답은 여기에서도 문제를 해결할 수 있습니다.

https://stackoverflow.com/a/27967674/543814

  • 바꾸기 대신 일치를 사용합니다.
  • 그룹 대신에 그룹 $1을 읽을 것 $2입니다.
  • 그룹 $2은 캡쳐하지 않고 만들어 졌으므로 피할 수 있습니다.

예:

Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");

첫 번째 캡처 그룹은 피할 패턴을 지정합니다. 마지막 캡처 그룹은 다른 모든 것을 캡처합니다. 간단히 그 그룹을 읽으십시오 $2.