[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을보십시오)
참고
답변
정규 언어의 보완은 정규 언어이지만이를 구성 하려면 정규 언어에 대한 DFA 를 작성하고 유효한 상태를 오류로 변경해야합니다. 예를 보려면 이것을 참조하십시오 . 어떤 페이지가 말을하지 않는 것은 변환이다 /(ac|bd)/
에 /(a[^c]?|b[^d]?|[^ab])/
. DFA에서 정규 표현식으로 다시 변환하는 것은 쉽지 않습니다. 이전에 제안한 것처럼 정규식을 변경하지 않고 코드의 의미를 변경할 수 있으면 더 쉽습니다.
답변
답변
내 대답은 여기에서도 문제를 해결할 수 있습니다.
https://stackoverflow.com/a/27967674/543814
- 바꾸기 대신 일치를 사용합니다.
- 그룹 대신에 그룹
$1
을 읽을 것$2
입니다. - 그룹
$2
은 캡쳐하지 않고 만들어 졌으므로 피할 수 있습니다.
예:
Regex.Match("50% of 50% is 25%", "(\d+\%)|(.+?)");
첫 번째 캡처 그룹은 피할 패턴을 지정합니다. 마지막 캡처 그룹은 다른 모든 것을 캡처합니다. 간단히 그 그룹을 읽으십시오 $2
.