정규식 : 특정 패턴을 제외한 모든 패턴과 일치


310

특정 패턴으로 시작하는 문자열을 제외 하고 모든 것을 일치시킬 수있는 정규식이 필요합니다 (특히 index.php다음과 같은 것 index.php?id=2342343)


그리고 어떤 특정 패턴을 일치시키지 않겠습니까?
Dominic Rodger

2
패턴과 일치하지 않고 문자열과 일치하는 경우 무언가를 할 수없는 이유가 있습니까?
Thomas Owens


@ThomasOwens : 따라 다릅니다. 표현의 어느 부분이 무효화되는지에 달려 있습니다. 전체 표현을 무효화하려면 요점을 알 수 있습니다. 예를 들어, "문자열에 'Bruce'가 하위 문자열로 포함되어 있지 않으면 무언가를 수행하십시오." . 그러나 하위 표현을 부정하고 싶을 수도 있습니다. 예를 들어, firstname은 성, 이름은 XYZ를 제외한 모든 이름, 여기서 XYZ는 Bruce라는 유명인의 성입니다.
mathheadinclouds 2016

답변:


250

정규 표현식 전문가는 아니지만 처음부터 부정적인 예측을 사용할 수 있다고 생각합니다. 예를 들어로 ^(?!foo).*$시작하는 것과 일치해서는 안됩니다 foo.


7
grep과 함께 -P를 사용하여 미리보기를 활성화하십시오.
Seppo Enarvi 10

원하는 동작을 "foo는"또는 "바"되고 일치하지 않는 경우,이 답변을 확인하십시오 stackoverflow.com/a/2404330/874824을
dave_k_smith

15
이 대답은 틀 렸습니다. 빠른 테스트에 따르면 나는 당신이 의미하는 것은 ^((?!foo).)*$( stackoverflow.com/a/406408/3964381 )
gilad mayani

4
사용한 기호와 왜 사용했는지 설명해 주시겠습니까?
rotimi-best

339

정규식 : 모든 것을 제외하고 :

데모 참고 사항 : 줄 바꿈 \n은 데모의 부정 문자 클래스 내부에서 사용되어 인접한 줄과의 일치 오버플로를 피합니다. 개별 문자열을 테스트 할 때는 필요하지 않습니다.

앵커 참고 : 많은 언어에서 \A문자열의 명확한 시작 을 정의하는 데 사용하고 문자열의 끝을 정의하려면 \zPython \Z에서 JavaScript에서는 $괜찮습니다.

점 참고 : POSIX, TRE, TCL이 아닌 많은 맛 에서 개행 문자를 제외한. 모든 문자와 일치합니다 . 개행을 포함한 모든 문자와 일치 시키 려면 해당 DOTALL 수정 자 ( PCRE / Boost / .NET / Python / Java 및 Ruby)를 사용해야합니다 ./s/m.

백 슬래시 참고 : 이스케이프 시퀀스를 허용하는 C 문자열로 패턴을 선언해야하는 언어 (예 \n: 줄 바꿈 과 같은 )에서는 엔진이 리터럴 문자 (예 : Java)로 처리 할 수 ​​있도록 특수 문자를 이스케이프 처리하는 백 슬래시를 두 배로 늘려야 world\.합니다. 로 선언 "world\\."하거나 문자 클래스를 사용하십시오 :) "world[.]". 원시 문자열 리터럴 (Python r'\bworld\b'), C # @"world\."완전 문자열 리터럴 또는 슬래시 문자열 / 정규 리터럴 표기법을 사용하십시오 /world\./.


잘 쓰세요! 의 예와 함께 "일부 문자열과 같지 않은 문자열"의 ^(?!foo$)경우 표현식이 작동하려면 달러 기호가 괄호 안에 있어야하는 이유는 무엇입니까? 나는 ^(?!foo)$같은 결과를 줄 것으로 기대 했지만 그렇지 않았습니다.
그랜트 험프리

3
@GrantHumphries : $앵커가 lookahead 내부에 있을 때 , 이는 조건의 일부이며 너비0 인 어설 션의 일부입니다 . 에서와 같이 외부에있는 경우 문자열 시작 직후 문자열 끝을 필요로 ^(?!foo)$하는 소비 패턴의 일부 이므로 항상 true를 반환하므로 음수 예측이 관련 이 없습니다 (문자열 끝 이후에는 텍스트가있을 수 없음) 혼자하자 foo). 따라서, ^(?!foo$)뒤에 오는 문자열의 시작 부분과 일치 foo하는 문자열의 끝 부분이 일치합니다. ^(?!foo)$빈 문자열과 일치합니다.
Wiktor Stribiżew

@ robots.txt이 주석을 제거하십시오. 당신은 XY 질문을하고 있습니다. 문자 클래스는 단일 문자와 일치하기 때문에 문자 순서를 정의 할 방법이 없습니다. 문자열의 시작과 첫 번째 cot또는 사이의 하위 문자열을 찾아서 다음 lan과 같이 일치 항목을 제거해야합니다 regex.replace(myString, "^.*?(?:cot|lan)\s*", "").
Wiktor Stribiżew

친애하는 Wiktor. 내 질문을 닫았지만 귀하의 링크 된 답변이 실패합니다. 내 질문을 업데이트했습니다 stackoverflow.com/questions/60004380/…
MonsterMMORPG

예를 들어, 패키지 <!-및 웹 페이지 <!-asdasasdas-> 편집기에서 사용-> Lorem Ipsum”
MonsterMMORPG

259

^문자 세트의 시작 부분에 해당 문자 이외의 문자와 일치하도록 a 를 넣을 수 있습니다 .

[^=]*

모든 것을 일치 시키지만 =


55
사실이지만 한 번에 한 문자 만 처리합니다. 두 개 이상의 문자 시퀀스를 제외하려면 다른 응답자가 말한 것처럼 부정적인 미리보기를 사용해야합니다.
Alan Moore

완벽한 솔루션 tu는 바람직하지 않은 문자를 제외 하고 패턴의 문자를 제거합니다 . 감사합니다
Sirmyself

@Alan, "... 당신은 ... 음 내다을 사용해야은"잘못이지만, Wiktor는 그의 대답을 게시하지 않았기 때문에 우리는 당신을 너무 열심히 안 - 어떤 쇼 왜 - 2016 년까지
캐리 Swoveland

6

그냥 일치 /^index\.php/다음과 일치하는 어떤 거부합니다.


아마 썼다 str !~ /\Aindex\.php/.
Cary Swoveland

6

파이썬에서 :

>>> import re
>>> p='^(?!index\.php\?[0-9]+).*$'
>>> s1='index.php?12345'
>>> re.match(p,s1)
>>> s2='index.html?12345'
>>> re.match(p,s2)
<_sre.SRE_Match object at 0xb7d65fa8>

3
"index_php"또는 "index # php"를 거부합니다.

1

내가 할 정규식 할 필요가 모든 것을 일치 하지만 제외시켰다 로 시작하는 문자열을 index.php 특정 패턴 (특히 index.php를 다음과 무엇의 index.php 같은? ID = 2342343)

사용 방법 Exec

    let match,
        arr = [],
        myRe = /([\s\S]+?)(?:index\.php\?id.+)/g;

    var str = 'http://regular-viragenia/index.php?id=2342343';

    while ((match = myRe.exec(str)) != null) {
         arr.push(match[1]);
    } 
    
    console.log(arr);

var myRe = /([\s\S]+?)(?:index\.php\?id=.+)/g;
var str = 'http://regular-viragenia/index.php?id=2342343';
var matches_array = myRe.exec(str);
console.log(matches_array[1]);

또는 다른 경기

let match,
            arr = [],
            myRe = /index.php\?id=((?:(?!index)[\s\S])*)/g;

        var str = 'http://regular-viragenia/index.php?id=2342343index.php?id=111index.php?id=222';

        while ((match = myRe.exec(str)) != null) {
             arr.push(match[1]);
        } 

        console.log(arr);


-13

정규식을 사용하지 않는 것은 어떻습니까?

// In PHP
0 !== strpos($string, 'index.php')

11
OP가 구체적으로 정규 표현식을 요청했습니다 ... 이것이 도움이 될지 모르겠습니다! ( grep예를 들어, 명령 행, Perl / Python / 다른 언어 또는 텍스트 편집기에서 "모든 행에 대해이 정규식 실행"명령 등을 사용
중일 수 있습니다
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.