지정된 문자열을 제외한 모든 항목과 일치


119

다음 정규식이 "red", "green"또는 "blue"와 일치한다는 것을 알고 있습니다.

red|green|blue

지정된 여러 문자열을 제외한 모든 항목과 일치하도록 만드는 간단한 방법이 있습니까?


1
모든 종류의 정규식이이 작업을 수행 할 수있는 것은 아닙니다. 어떤 환경에서 일하고 있습니까? 자바? 펄? .그물? 일부 C / C ++ 정규식 라이브러리? RDBMS?
FrustratedWithFormsDesigner

8
원하는 것을 말하지는 않지만 단순히 "일치"작업의 의미를 뒤집을 수 있습니다. 일치하지 않는 부분에서 추출을 시도하는 경우 도움이되지 않지만 제외 된 문자열이 없는지 테스트하려면 작동합니다. if (!s.match(/red|green|blue/)) ... 참고 : OP가 어떤 언어 / 프레임 워크를 지정하지 않는다는 것을 알고 있습니다. 앞의 내용은 규범적인 예가 아니라 일반적인 예로 간주되어야합니다.
tvanfosson

답변:


154

문자열이 빨강, 녹색 또는 파랑이 아닌지 확인하려면 caskey의 대답은 그것입니다. 그러나 종종 원하는 것은 선의 어디에도 빨강, 녹색 또는 파랑이 포함되어 있지 않은지 확인하는 것입니다. 이를 위해 정규 표현식을 다음 ^과 같이 고정 .*하고 부정적인 예측에 포함합니다.

^(?!.*(red|green|blue))

또한 "engine"이라는 단어는 포함하지만 해당 색상은 포함하지 않는 행을 원한다고 가정하십시오.

^(?!.*(red|green|blue)).*engine

.*정규식의 머리에를 인수 할 수 있다고 생각할 수 있습니다 .

^.*(?!red|green|blue)engine     # Does not work

하지만 당신은 할 수 없습니다. .*작동하려면 두 인스턴스가 모두 있어야합니다 .


48

언어에 따라 다르지만 일반적으로 다음과 같이 넣을 수있는 부정적인 주장이 있습니다.

(?!red|green|blue)

(구문 수정 덕분에 위의 내용은 유효한 Java 및 Perl, YMMV입니다)


2
@caskey, 완전한 대답은 나와 당신의 조합입니다. 함께 병합하려면 내 항목을 삭제하겠습니다.
Wayne Conrad

14
이 대답은 당신이 그것을 조금 설명하면 훨씬 더 유용 할 것입니다. 예 : "?" 그리고 "!" 평균? 캡처 그룹이 필요한 이유는 무엇입니까?
LII

또한 유효한 Python입니다.
Joe Mornin 2015 년

Delphi regEx 라이브러리와 함께 사용했으며 다음과 같이 작동합니다. ^ (?! red | green | blue). regex101.com 에서 테스트하는 경우에도 마찬가지입니다 . 위의 오타가 ^가 누락되었거나 실제로 Java / Perl / Python ..에서 작동합니까?
Peter

33

주어진 문자열을 제외한 모든 항목 일치

특정 문자열을 제외한 모든 항목을 일치시키려는 전체 문자열을 일치 시키려면 다음과 같이 할 수 있습니다.

^(?!(red|green|blue)$).*$

즉, 빨강, 녹색 또는 파랑으로 시작하고 끝날 수없는 문자열의 시작 부분에서 일치를 시작하고 다른 항목은 문자열의 끝까지 일치시킵니다.

여기에서 시도 할 수 있습니다 : https://regex101.com/r/rMbYHz/2

이것은 부정적 예측 을 지원하는 정규식 엔진에서만 작동합니다 .


23

부정적인 예견이 필요하지 않습니다. 작동하는 예가 있습니다.

/([\s\S]*?)(red|green|blue|)/g

기술:

  • [\s\S] -모든 문자와 일치
  • * -이전 그룹에서 0에서 무제한까지 일치
  • ? -가능한 한 적게 일치
  • (red|green|blue|) -이 단어 중 하나 또는 아무것도 일치하지 않음
  • g -반복 패턴

예:

whiteredwhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredwhiteredgreenbluewhiteredwhiteredwhiteredwhiteredwhiteredredgreenredgreenredgreenredgreenredgreenbluewhiteredbluewhiteredbluewhiteredbluewhiteredbluewhiteredwhite

될거야:

whitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhitewhite

테스트 : regex101.com


4
[\ s \ S]를 점으로 바꾸면 걸음 수를 대폭 줄일 수 있습니다. 다른 모든 예제가 각 단어를 개별적으로 캡처하는 이유가 매우 혼란 스러웠습니다. 이 방법은 정규식 단계가 약간 더 많지만 사후 처리가 훨씬 적습니다.
Zatronium

3
그러나 이것은 일치 (텍스트 유효성 검사)를 수행하지 않으며 대체 중에 지정된 텍스트를 제거합니다.
Marek R

이 솔루션은 알려진 단어 뒤에 최종 텍스트 청크를 출력하지 않습니다. 따라서 속도를 비교할 필요가 없습니다. 단지 잘못된 것입니다.
Wiktor Stribiżew

@ WiktorStribiżew가 수정되었습니다.
hlcs

10

나는 같은 질문이 있었고 제안 된 솔루션은 거의 작동했지만 문제가있었습니다. 결국 내가 사용한 정규식은 다음과 같습니다.

^(?!red|green|blue).*

Javascript와 .NET에서 테스트했습니다.

. *는 ^ (?!. * red | green | blue)와 같이 부정적인 예견 안에 배치되어서는 안됩니다. 그렇지 않으면 첫 번째 요소가 나머지 요소와 다르게 동작하게됩니다 (예 : "anotherred"는 "일치하는 동안 일치하지 않습니다." 또 다른 녹색 "것입니다)


3

모든 텍스트와 일치하지만 패턴과 일치하는 텍스트는 일반적으로 정규식 패턴으로 문자열을 분할 하여 수행됩니다. .

:

  • - Regex.Split(text, @"red|green|blue")또는 빈 값을 제거하려면 Regex.Split(text, @"red|green|blue").Where(x => !string.IsNullOrEmpty(x))( 데모 참조 )
  • - Regex.Split(text, "red|green|blue")또는 빈 항목을 제거하려면 Regex.Split(text, "red|green|blue").Where(Function(s) Not String.IsNullOrWhitespace(s))( demo 또는 LINQ가 지원되는 이 데모 참조 )
  • - text.split(/red|green|blue/)( g여기에 수정자를 사용할 필요가 없습니다 !) (빈 값을 제거하려면을 사용 text.split(/red|green|blue/).filter(Boolean)하십시오), 데모를 참조하십시오.
  • - text.split("red|green|blue")또는-모든 후행 빈 항목을 유지하려면-을 사용 text.split("red|green|blue", -1)하거나 모든 빈 항목 을 제거 하려면 더 많은 코드를 사용 하여 제거합니다 ( 데모 참조 ).
  • -Java와 유사하게 text.split(/red|green|blue/)모든 후행 항목 사용을 가져 text.split(/red|green|blue/, -1)오고 모든 빈 항목 사용을 제거합니다 text.split(/red|green|blue/).findAll {it != ""})( 데모 참조 ).
  • - text.split(Regex("red|green|blue"))또는 빈 항목을 제거하려면을 사용 text.split(Regex("red|green|blue")).filter{ !it.isBlank() }하고 데모를 참조하십시오.
  • - text.split("red|green|blue")또는 모든 후행 빈 항목을 유지하려면 text.split("red|green|blue", -1)및을 사용 하여 모든 빈 항목을 제거하려면 text.split("red|green|blue").filter(_.nonEmpty)( 데모 참조 )
  • - text.split(/red|green|blue/), 빈 값을 제거하려면 .split(/red|green|blue/).reject(&:empty?)(그리고 선행 및 후행 빈 항목을 모두 가져 오려면 두 -1번째 인수로 사용 .split(/red|green|blue/, -1)하십시오.) ( 데모 참조 )
  • - my @result1 = split /red|green|blue/, $text;또는 모든 후행 빈 항목이 my @result2 = split /red|green|blue/, $text, -1;있거나 비어있는 항목이없는 경우 my @result3 = grep { /\S/ } split /red|green|blue/, $text;( 데모 참조 )
  • - preg_split('~red|green|blue~', $text)또는 preg_split('~red|green|blue~', $text, -1, PREG_SPLIT_NO_EMPTY)빈 항목을 출력하지 않으려면 ( 데모 참조 )
  • - re.split(r'red|green|blue', text)또는 빈 항목을 제거하려면 list(filter(None, re.split(r'red|green|blue', text)))( 데모 참조 )
  • -를 사용 regexp.MustCompile("red|green|blue").Split(text, -1)하고 빈 항목을 제거해야하는 경우이 코드를 사용 합니다 . Go 데모를 참조하십시오 .

참고 : 패턴에 캡처 그룹이 포함 된 경우 정규식 분할 함수 / 방법 추가 옵션에 따라 다르게 작동 할 수 있습니다. 그런 다음 적절한 분할 방법 문서를 참조하십시오.


0

"빨간색"이라는 단어를 제외한 모든

var href = '(text-1) (red) (text-3) (text-4) (text-5)';

var test = href.replace(/\((\b(?!red\b)[\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

"빨간색"이라는 단어를 제외한 모든

var href = '(text-1) (frede) (text-3) (text-4) (text-5)';

var test = href.replace(/\(([\s\S]*?)\)/g, testF); 

function testF(match, p1, p2, offset, str_full) {
  p1 = p1.replace(/red/g, '');
  p1 = "-"+p1+"-";
  return p1;
}

console.log(test);

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.