2012-01-21 2 views
0

이 정규 표현식의 대중적인 (28k 조회) question을 이미 읽었습니다. 그러나 그것은 나를 위해 작동하지 않습니다. 더 나은 정규 표현식이 발견되었지만 나는 잠시 동안은 거의 붙어 있지 않습니다.주어진리스트를 제외한 모든 단어를 일치시키는 정규식 (2)

whisky/gin/nuka-cola/beer/liqueur/abs-inth/tea 

및 스크립트가 아닌 모든 청량 음료를 얻어야한다 : 여기

음료의 목록입니다. 나는 이것에 대한 좋은 정규식을 발견했다 :

/\b(?!(?:tea|nuka\-cola)\b)[\w\d\-]+\b/ 

그리고 결과는 다음과 같습니다

1 : whisky 
2 : gin 
3 : -cola 
4 : beer 
5 : liqueur 
6 : abs-inth 

문제는 콜라 (3 결과)에 있습니다. 이것은 \ b가 '-'문자를 좋아하지 않기 때문입니다. 목록에서이 콜라를 제거하도록 도와주세요.

+0

아마도 '/'로 나눠서 접근 한 다음, 문자열 검색 (또는 결혼하면 정규식)을 사용하여'차 '또는'콜라 '를 찾고 목록에서 일치하는 것을 부정합니다 토큰 수 –

+0

빠른 해결 방법으로 허용되지 않은 음료에'-cola'를 추가하십시오. – tripleee

+0

@ tripleee 및 그 경우에는 '콜라'도 있습니다. – Qtax

답변

1

\b은 영숫자와 영숫자가 아닌 문자 사이에서 일치하므로, 대시 앞뒤에 일치합니다 (nuka-cola).

따라서 단어 경계 앵커로 \b을 사용할 수는 없지만 직접 정의 할 수는 있습니다.

/(?<=\/|^)(?!(?:tea|nuka\-cola)(?=\/|$))[\w\d\-]+(?=\/|$)/ 

이 당신이를 사용하는 가정 물론 : 당신의 구분 /은 단순히 "끝 단어"앵커로 "시작 - 중 - 단어"앵커로 (?<=/|^)(?=/|$)를 사용하는 것을보고 lookbehind 어설 션을 지원하는 regex 엔진. 유감스럽게도이 언어가 어떤 언어인지 지정하지 않았습니다. 예를 들어, JavaScript는 lookbehind를 지원하지 않습니다.

/(?!tea|nuka-cola)([\w-]+) 

더 두있는에 계획하는 경우 : 당신이 확인하는 경우

(?>[\w-]+)(?<!tea|nuka-cola) 

또 다른 가능성은, 각 키워드는 슬래시로 시작 :이 정규 표현식은 트릭을 할해야

+0

설명 주셔서 대단히 감사합니다! 정말 도움이됩니다! –

1

귀하의 결과에 나타나지 않아야 음료, 정규식이 빨리 못생긴 수 있습니다. 이 경우 목록의 모든 단어와 일치하고 일치하는 단어가 HashSet에 있는지 확인하는 정규식 (또는 간단한 루프)이 있습니다. 일치하는 항목이 있으면 결과에 일치 항목을 포함시키지 않습니다.

관련 문제