2009-05-14 5 views
6

나는 문장이 있는데, 나는 그 문장에서 몇 마디를 제거하고 싶다.RegExp : 문장에서 불필요한 단어를 제거하고 싶습니다. 내가 어떻게 해?

그래서 내가있는 경우 :

"jQuery is a Unique language" 

및 garbageStrings라는 배열 :

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 

는 나는 "입니다"와 "A"문장에서 제거 할.

하지만 다음을 사용하는 경우 : /이 문은 for 루프 안에 있습니다. 나는 전체 문장을 반복하고 문자열이 "는"이 언어로 문장에서 제거된다 "jQuery를 고유 lnguge"

공지 될 것입니다

var regexp = new RegExp(garbageStrings[i]); 

garbageStrings에서 일치를/찾는거야.

나는 그렇게 할 생각이 없었습니다.

+0

@Chas : 제시된 구문과 Regexp 객체가 Javascript에 내재되어 있음을 이해합니다. 그러나 OP가 완전히 언급하지 않으므로 언어 ​​태그를 변경하는 것이 좋습니다. – Cerebrus

+1

@Keira : +1은 당신의 이름이 나를 웃게 해주기 때문에 +1합니다! – Cerebrus

+0

@Cerebrus 그것이 틀린 경우 OP는 그것을 다시 바꿀 수 있지만 이것은 더 많은 청중에게 질문을 전달합니다. 언어 불가지론 자일 필요가있는 경우, OP는 그것을 언어에 구애받지 않아야한다고 표시해야합니다. –

답변

4

내가 맹세 할 수있는 자바 스크립트 \b (워드 경계)을했다하지만, 대신이 시도하지 않는 것 같습니다 :

var regex = new RegExp("(|^)" + "a" + "(|$)", "g"); 
var string = "I saw a big cat, it had a tail."; 

string = string.replace(regex, "$1$2"); 
+0

나는 이것을 시도했지만 작동하지 않았다. –

3

먼저이 가능한 각 유형을 통해 루프를 가질려고하는 경우에, "garbageString"중, Regex를 사용하지 않아도됩니다.

둘째, "전체 단어 만 검색"해야합니다. 이것은 앞에 단어 구분 기호 (예 : 공백 문자)가 오는 경우에만 가비지 문자열과 일치한다는 것을 의미합니다. 이를 구현하면 Regex 기반 매치가 유용합니다.

문장 부호가 있으면이 코드는 작동하지 않지만 필요에 따라 코드를 변경하기가 너무 어려워서는 안됩니다. 이 같은

var text = "jQuery is a Unique language"; 
var garbageStrings = {"of": true, 
         "the": true, 
         "in": true, 
         "on": true, 
         "at": true, 
         "to": true, 
         "a": true, 
         "is": true}; 

var words = text.split(" "); 
var newWords = Array() 
for (var i = 0; i < words.length; i++) { 
    if (typeof(garbageStrings[words[i]]) == "undefined") { 
     newWords.push(words[i]); 
    } 
} 
text = newWords.join(" "); 
+0

@gs : 편집 해 주셔서 감사합니다! :-) – Cerebrus

12

뭔가 : 그들은 빨리되기 때문에

function keyword(s) { 
    var words = ['of', 'the', 'in', 'on', 'at', 'to', 'a', 'is']; 
    var re = new RegExp('\\b(' + words.join('|') + ')\\b', 'g'); 
    return (s || '').replace(re, '').replace(/[ ]{2,}/, ' '); 
} 
+3

+1,하지만 모든 단어를 가독성을 위해 배열에 넣은 다음 .join ('|')을 사용하여 정규 표현식에 넣습니다. – nickf

+0

예. 또한 짜내다 정규 표현식을 세련. – wombleton

+1

공백은 단어 경계가 아니라'\ W' 클래스의 모든 문자입니다. 그래서 하이픈도. – Gumbo

0

는 첫째,이에 대한 배열을 사용할 필요는 정규식 없습니다. 정규 표현식은 더 복잡하고 너무 무겁다. Atwood가 말했듯이 프로그래머는 정규 표현식으로 문제를 해결할 수 있다고 생각합니다. 그렇다면 그는 두 가지 문제가 있습니다.

가비지 문자열 목록을 사용하는 빠른 구현은 자바 스크립트의 내장 사전 속도를 악용하여 가비지 여부를 확인하고 구두점을 처리하는 작업을 수행합니다. a little test page을 사용해 볼 수 있습니다.

function splitwords(str) { 
    var unpunctuated = unpunctuate(str); 
    var splitted = unpunctuated.split(" "); 
    return splitted; 
} 

function unpunctuate(str) { 
    var punctuation = ['.', ',', ';', ':', '-']; 
    var unpunctuated = str; 
    for(punctidx in punctuation) { 
    punct = punctuation[punctidx]; 
    // this line removes punctuation. to keep it, swap in the line below. 
    //unpunctuated = unpunctuated.replace(punct," "+punct+" "); 
    unpunctuated = unpunctuated.replace(punct,""); 
    } 
    return unpunctuated; 
} 


var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 

var garbagedict= {}; 

for(garbstr in garbageStrings) { 
    garbagedict[garbageStrings[garbstr]] = 1; 
} 

function remove(str) { 
    words = splitwords(str); 
    keeps = []; 
    for(wordidx in words) { 
    word = words[wordidx]; 
    if(word in garbagedict) { 
     // ignore 
    } else { 
     keeps.push(word); 
    } 
    } 
    return keeps.join(" "); 
} 
+0

앳 우드 (Atwood)는 그 말을 인용하지 않았습니다. http://en.wikipedia.org/wiki/Jamie_Zawinski –

+0

Atwood는 Regex를 좋아합니까? 나는 그것을 소스에서 본다면 잠깐 후에 그 코드를 삭제할 것이다. –

+0

@Chad : 더 나은 것을 제공하십시오. @Paulo : Atwood에서 들었는데 따옴표가 아닙니다. 이 코드의 핵심은 OP가 원하는 작업을 수행한다는 것입니다. 정규식은 패턴 일치에 적합하지만 패턴 일치는 아닙니다. 그것은 간단한 단어 비교입니다. 심플은 여기에서 확실히 좋습니다. –

0

RegExp를 사용하지 마십시오. 더럽고 불필요하며 너무 많은주기가 소요됩니다. 쉽게 :

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 
for(var i=0; i < garbageString.length; i++){ 
    string.replace(" "+garbageStrings[i]+" ", ""); 
} 

또는 사용하여 배열 : wombleton처럼

var garbageStrings = ['of', 'the', "in", "on", "at", "to", "a", "is"]; 
var str = str.split(" "); 
for(var i=0; i < garbageStrings.length; i++){ 
    for(var j=0; j < str.length; j++){ 
     if(str[j].toLowerCase() === garbageStrings[i]){ 
      str.splice(j, 1); 
     } 
    } 
} 
str = str.join(" "); 
0

말했다.;)

내가 정규식 자체의 일환으로 공백을 제거하기보다는이() 더 나은 성능을 위해 두 번째 정규식을 사용 제외 :

var re = new RegExp("\\b(?:"+ words.join("|") + ")\\b\\s*", "gi"); 
s.replace(re, ""); 

정규식은 객체 생성에 컴파일됩니다. 반복되는 작업에서 문자열/배열 작업으로 각 단어를 반복하는 것보다 눈에 띄게 느려서는 안되며 이해하기가 훨씬 쉽습니다. 그냥 중지 단어의 짧은 정적 목록이있는 경우, 당신은 대신 자신 만의 최적화 된 정규 표현식을 쓸 수

:

var re = new RegExp("\\b(?:at?|i[ns]|o[fn]|t(?:he|o))\\b\\s*", "gi"); 
"jQuery is a Unique language".replace(re, ""); 

아이디어는 여기입니다에 "와"의 "같은 접두사를 공유하는 단어 (예 : ")는 서로 다른 지점까지 동일한 실행 경로를 공유합니다. 당신의 경우에는 거의 필요 없지만, 알아두면 좋습니다.

관련 문제