2014-11-22 3 views
0

사람들이 사용하는 단어 필터를 쓰고 있는데 사람들이 그렇듯이 필터를 파괴하려고합니다. 내 목적을 위해 "hello"라는 단어를 걸러 내기를 원하지만 "h l l l o"또는 "h.e.l.l.o"도 걸러 내고 싶습니다.공백으로 구분 된 단어는 어떻게 제외합니까?

나는 단어 경계에 대해 신경 쓰지 만 운이 없다.

// works 
message = message.replace(/\bhello\b/gi, "hello"); 
// doesn't 
message = message.replace(/\bh\b\be\b\bl\b\bl\b\bo\b/gi, "hello"); 
+0

"h.l l.o"'(점과 공백이 섞여서) 어떻게해야합니까? 이것도 정규 표현식과 일치해야합니까? –

+0

@ChristianHujer 물론입니다. :) 나는 둘 다했던 정규 표현식을 가질 수 있다고 생각조차하지 못했습니다. –

답변

2

아마도 정규 표현식은 /\bh\W?e\W?l\W?l\W?o\b/입니다. 공간과 일치하는 원자가 필요합니다. \ W는 단어가 아닌 문자 (영숫자의 반대)와 일치하는 원자입니다. ? 는 한정사이며 앞의 원자를 0 번 또는 1 번 일치시킬 수 있습니다.

1

는이

h[\W]*e[\W]*l[\W]*l[\W]*o 

같은 것을 사용하지만 많은 문자열을 작성하는 고통스러운 세상에, 읽기 어려워 할 수 있습니다. 당신은 기본 문자열을 구축하고 자신의 정규식 문자열의 자바 스크립트 작성하기 위해 정규식을 사용 할 수 있습니다 당신은 변수 방지를 편집 할 수있는 정규식 개체를 만드는 데 사용하고이

을 일치하는 것을 사용할 수 있습니다

// Pipe delimited list of words, surrounded by parentheses 
var rwords = '(howdy|hello|organic)'; 
// Variable for easy manipulation, sets disallowed characters. 
var anti = "[^a-z]*"; 
// Replace each character with the same followed by the character class contained in the 'anti' variable. 
rwords = rwords.replace(/([a-z])/igm,'$1' + anti); 
// Surround each side in word boundary markers 
rwords = '\\b' + rwords + '\\b'; 
// Output the regex string as a sample, but you can create a regex object 
console.log(rwords); 

괜찮은 문자를 담아두기. 숫자를 말하면 '[^ a-z0-9]'로 바꿀 수 있습니다.

+1

나는 OP가 interstitial non-word로 어떻게 추론하는지 모르겠다.하지만 그가'h_ell_o' 나'hell0'으로 돌아 가면 모든 것이 사라진다. – sln

+0

@sln 내 의견을 말끔히 털어 놓았지만, 당신은 절대적으로 옳았습니다. [\ W]는 무언가 (그와'.')를 우회하려고 시도한 goto 문자 인'_'를 허용했을 것입니다. 이 경우, 나는 좋은 오래된'a-z'가 더 나은 옵션이라고 생각하고 있습니다. 가장 쉬운 변화를위한 캐릭터 클래스를 유지하는 변수가 있습니다. –

관련 문제