단어 / 문자열을 제외하는 정규식


298

다음과 같은 정규식이 있습니다.

^/[a-z0-9]+$

이 같은 문자열과 일치 /hello하거나 /hello123.

그러나 /ignoremeand와 같은 두 문자열 값을 제외하고 싶습니다 /ignoreme2.

몇 가지 변형을 시도했지만 작동하지 않는 것 같습니다!

나의 최근 미약 한 시도는

^/(((?!ignoreme)|(?!ignoreme2))[a-z0-9])+$

어떤 도움을 주셔서 감사합니다 :-)


답변:


376

또 다른 방법은 다음과 같습니다 ( 부정적 인 미리보기 사용 ).

^/(?!ignoreme|ignoreme2|ignoremeN)([a-z0-9]+)$ 

참고 : 캡처 식은 하나뿐입니다 ([a-z0-9]+).


1
훌륭해, 그 트릭을 한 것 같습니다. URL 재 작성에 실제로이 규칙이 필요하며 "images", "css"및 "js"폴더를 무시하고 싶었습니다. 따라서 내 규칙은 다음과 같습니다. ^ / (?! css | js | images) ([az] +) /? (\? (. +))? $ 그리고 /Profile.aspx?id=$1&$3에 다시 씁니다. 이 규칙이 올바르게 작동하고 쿼리 문자열도 전파됩니까? 그래서 누군가 방문하면 mydomain.com/hello?abc=123 I가 다시 그것을 싶습니다 mydomain.com/Profile.aspx?id=hello&abc=123 나는 또한의 성능에 대한 비트 확실 해요. (+)에서 원래 요청에서 쿼리 문자열을 캡처하는 끝.
romiem

이것은 또 다른 질문입니다. 정규 표현식은 쿼리 문자열을 캡처합니다-테스트하고 쿼리 문자열이 나타나는지 확인하십시오. 또한- (\?(.+))?$빨라야합니다. 나는 속도에 대해 너무 걱정하지 않을 것입니다.
세스

1
Alix Axel의 솔루션은 효과가 있었지만 나에게는 효과가 없었습니다. Java java.util.regex.Pattern클래스를 사용하고 있습니다.
Mark Jeronimus

1
예를 들어 Pycharm은 Java 기반입니까, 그렇지 않습니까? 따라서 Pycharm 검색 Alix의 솔루션에서 정규 표현식을 고려할 때 다른 것은 효과가 없습니다.
fanny sep

43

이것은해야합니다 :

^/\b([a-z0-9]+)\b(?<!ignoreme|ignoreme2|ignoreme3)

무시할 수있는 단어를 원하는만큼 추가 할 수 있습니다. 다음은 간단한 PHP 구현입니다.

$ignoredWords = array('ignoreme', 'ignoreme2', 'ignoreme...');

preg_match('~^/\b([a-z0-9]+)\b(?<!' . implode('|', array_map('preg_quote', $ignoredWords)) . ')~i', $string);

뒤보기에는 고정 너비 패턴이 필요하다고 생각 했습니까?
사이먼

2
@AlixAxel 그것은하지만 더 똑똑한 정규식 라이브러리는 각 대안이 고정 길이 인 한 대안에 대해 다양한 길이의 대안을 허용하고 가장 오래 사용합니다.
ChrisF

이것은 똑똑하지만 무시 된 단어가 다른 단어의 끝에 있으면 실패합니다. 즉, 'a'를 무시한 단어들 중 하나로 추가하면 a로 끝나는 모든 단어는 무시됩니다
singmotor

21

두 단어를 모두 제외하려면 구성이 필요합니다.

^/(?!ignoreme$)(?!ignoreme2$)[a-z0-9]+$

이제 두 조건이 모두 일치 해야합니다 ( ignoremeignoreme2 는 허용 되지 않음 ).


1
이것은 대안 세트의 부정적 예측 인 위의 짧은 것과 같습니다.
ChrisF

4
@ChrisF 아니요, 실제로는 아닙니다. Seth의 솔루션 은 뒤에 /ignoremenot나오는 것과 같은 것과 일치하지 않습니다 . /ignoreme
Gumbo
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.