2009-08-08 3 views
0

이것은 here 질문의 약간 수정 된 버전입니다. 차이점은 앞이나 뒤쪽에있는 굵은 태그에 특수 문자가 포함되지 않는다는 것입니다.Javascript Regex : 건초 더미에서 바늘을 튀기 편집

바늘과 건초 더미가 있다면 바늘 주위에 과감한 태그를 넣고 싶습니다. 그래서 replace()와 함께 사용할 정규 표현식은 무엇입니까? SPACE가 delimeter가되도록하고 검색에서 대소 문자를 구별하지 않기를 원합니다. 검색에서 무시할 특수 문자 (예 : @! #.())를 사용합니다.

바늘이 "암소"이고 건초 더미는 ...

cows, at www.cows.com, milk some COWS! 

또한 키워드 "누가 MGMT는"그래서 경우에 공백을 가질 수 있어야 키워드가

<b>cows</b>, at www.cows.com, milk some <b>COWS</b>! 

로 변신 것입니다

great band. who. is. mgmt btw? 

great band. <b>who. is. mgmt</b> btw? 

참고로 점 될지는 나는이 현재 가지고 :

function updateHaystack(input, needle) { 
    return input.replace(new RegExp('(^|\\s)(' + needle + ')(\\s|$)','ig'), '$1<b>$2</b>$3'); 
} 

를 불행히도 않는 특수로 연결됩니다 굵게 표시되지 않은 단어 char ... 예. ! 소가 바로 전에 특수 문자를 포함하는 클래스를 생성 !<b>cow</b>

답변

0

로 전환하지 않는 needle 후 :

function updateHaystack(input, needle) { 
    var re = new RegExp('(^|\\s|[[email protected]#,])(' + needle + ')([[email protected]#,]|\\s|$)','ig'); 
    return input.replace(re, '$1<b>$2</b>$3'); 
} 

공지 사항, 그러나, 당신이 그 목록에 점 (.)를 추가하면, 당신 "www.cows.com"과 같은 것들을 매치시킬 것입니다. 그런 일이 일어나기를 원하지 않으면 질문의 범위를 좁혀 야합니다. 이 같은 점 (.) 또는 별표 (*) 같은 정규 표현식에서 의미를 가지고 문자가 포함 된 경우

또한, 당신은 needle을 탈출해야한다.

0

어쩌면 정규식이 필요한 것이 아닙니다. 패턴 자체 ("암소")가 독자적으로 정규 표현식이 아닌 패턴 일치를 찾으려면 패턴 일치 알고리즘을 사용해보십시오. 동시에 찾을 수있는 하나 개 이상의 패턴을 매우 효율적으로 할 경우에만 발견 (implementation example 구글의 curtusy) 또는 AC (Aho-Corasick)를 하나 개의 패턴이있는 경우

당신은 KMP (Knuth-Moriss-Pratt을 사용할 수 있습니다 (그렇지 않으면 당신은 KMP를 실행할 수 있습니다 여러번).

function boldNeedle(needle, haystack) { 
    var regex = RegExp("\\b(" + needle.replace(/[-[\]{}()*+?.\\^$|,#\s]/g, "\\$&") + ")\\b", "gi"); 
    return haystack.replace(regex, "<strong>$1</strong>"); 
}; 

boldNeedle("foo", "blah blah FOO blah foo blah") 
=== 
"blah blah <strong>FOO</strong> blah <strong>foo</strong> blah" 

편집 :

0

여기 내 솔루션입니다 나는이 다른 솔루션과 다른 방법을 설명합니다 : 그것은 그래서 그것의 어떤 부분이 정규 표현식으로 처리되지 않는 바늘을 이스케이프합니다.

+0

foo라는 단어가 다른 단어의 일부 였고 그 단어를 굵게 표시하려면 어떻게해야합니까? – crosenblum

+0

그런 다음'\ b's를 제거하십시오. –

관련 문제