2011-08-23 4 views
1

문자열에서 접두어를 제거해야합니다. 알려진 접두사의 배열을 감안할 때 어떤 접두사가 문자열에 존재하는지 알지 못합니다. 하나의 접두어 만 존재합니다.Javascript - 접두어 배열을 제거하는 Regex

function CleanupSupportedItems(data) { 
     var prefixes = new Array("TrialLeads", "IPG"); 

     for (var i = 0; i < prefixes.length - 1; i++) { 
      var prefix = new RegExp(/prefixes[i]/g); 
      //alert(prefix); 
      data = data.replace(prefix, ""); 
      alert(data); 
     } 
    } 

위의 코드는 두 번째 반복에서 undefined를 반환합니다.

통화

CleanupSupportedItems("TrialLeads11"); 

나는 "11"의 반환 값을 원하는을 감안할 때. 내가 어떻게 해?

+0

결과 값이 숫자가 될 경우 그 값을 필터링하는 것이 더 쉬울 것입니다 .... – sg3s

+0

@ sg3s - 예 반환 값은 항상 숫자입니다. 따라서 이러한 유형의 개선을위한 제안 사항은 언제든지 환영합니다. –

답변

4

당신은 루프없이 수행 할 수 있습니다

function CleanupSupportedItems(data) { 
    var prefixes = new Array("TrialLeads", "IPG"); 

    var prefix = new RegExp('^(' + prefixes.join('|') + ')', "g"); 
    data = data.replace(prefix, ""); 
    alert(data); 
} 

CleanupSupportedItems("TrialLeads11"); // alerts 11 
CleanupSupportedItems("IPG12"); // alerts 12 

여기 데모입니다 : 있도록 업데이트 http://jsfiddle.net/mrchief/KkRFp/

확실히 그것은 몸 사이에서 접두사를 교체하지. 그것을 지적을위한 minitech에게 감사드립니다.

제안 된 개선 사항으로 입력 접두사가 Regex Special characters 일 것으로 예상되는 경우 이스케이프 처리해야합니다.

+0

오, 나는 내 답변에서 언급 한 문제를 해결하기 위해 당신의 참여를 좋아합니다 :) +1. 데이터를 반환해야합니다. – Paulpro

+0

@PaulPRO : 방금 OP 코드를 수정했습니다. 그는 원래 문제가 해결 된 이후로 무엇이든 할 수 있습니다. :) – Mrchief

+0

join and new regex, nice trick +1 – amosrivera

1
RegExp.escape = function(text) { 
    return text.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&"); 
}; 

if(![].map) Array.prototype.map = function(f) { var r = [], i; for(i = 0; i < this.length; i++) r.push(f(this[i])); return r; }; 

function CleanupSupportedItems(data) { 
    var prefixes = ["TrialLeads", "IPG"]; 

    return data.replace(new RegExp('^(' + prefixes.map(RegExp.escape).join('|') + ')'), ''); // this line changed 
} 

이 작업을 수행해야합니다. 그리고 그것은 수행합니다 http://jsfiddle.net/minitech/XZwLU/ (그리고 http://jsfiddle.net/minitech/XZwLU/1/을 더 복잡한 예를 들어)

편집 : 당신은 단지 질문에, 하나의 접두사가있을 것이라고 말했다 것을 그냥 눈치. 그게 지금 고쳐 졌어. 당신은 제대로 정규식 객체를 생성하지 않는

2

, 대신 이렇게 :

var prefix = new RegExp('^'+prefixes[i], 'g'); 

를 루프 후 당신이해야 또한 return data;

참고 혹시 'TrailheadsIPG11'등 문자열이있는 경우 결과는 '11'이됩니다. 바꾸기가 성공하면 루프를 종료하지 않고 접두어 배열에 ()[]{}.*+? 또는 \d \w \s 등의 정규식에 특별한 의미가있는 시퀀스가 ​​포함되어있는 경우 결과가 정규 표현식으로 처리됩니다 문자가 아닙니다. 해당 기능을 보존하려면 대신 \.과 같은 문자를 이스케이프 처리하면됩니다.

내가 접두사의 목록을 기반으로 동적으로 정규식을 구축하고 빈 문자열로 대체 할
+0

문자열의 위치에 관계없이 단일 인스턴스 만이 아니라 모든 인스턴스를 대체하며 특수 문자 또는 기본 구두점을 이스케이프하지 못합니다. – Ryan

+0

@minitech 그것이 의미하는 바입니다. – Paulpro

+0

@minitech oh nevermind, 지금 당장 받으십시오. '^'를 추가하여 문자열의 시작 부분에서만 일치하도록했습니다. OP의 접두어 배열에는 아무 것도 포함되어 있지 않기 때문에 구두점을 이스케이프해야한다고 생각하지 않습니다. 그는 접두사 배열에 특수 정규식 문자가 포함될 수 있다고 언급했을 것입니다 – Paulpro

1

: 성능이 문제가되는 경우

function trimPrefixes(s, ps) { 
    return (""+s).replace(new RegExp('^(' + ps.join('|') + ')'), ''); 
} 
// For example... 
trimPrefixes("Foo123", ['Foo', 'Bar']); // => "123" 
trimPrefixes("Barzip", ['Foo', 'Bar']); // => "zip" 
trimPrefixes("I'm ok", ['Foo', 'Bar']); // => "I'm ok" 

당신은 또한 발전기에 해당 기능을 켤 수 있으며, 당신이있어 반복적으로 사용될 다양한 접두어 세트.

+0

도주를 잊어 버렸습니다 ... – Ryan

-1

가변 문자열을 regexp 객체에 전달할 때주의해야합니다.값은 항상 숫자입니다

function CleanupSupportedItems(data) { 
    var prefixes = new Array("TrialLeads", "IPG"); 

    for (var i = 0; i < prefixes.length - 1; i++) { 

     var prefix = new RegExp(prefixes[i], "g"); 
     //alert(prefix); 
     data = data.replace(prefix, ""); 
    } 
       alert(data); 
} 

CleanupSupportedItems("TrialLeads11"); 
+0

다시 이스케이프되지 않았지만 문자열의 아무 곳이나 대체합니다. – Ryan

1

경우와 문자열의 끝에서 : : 이런 식으로 뭔가를 시도

var int = string.match(/[\d]+$/); 
if(typeof int != 'undefined') 
{ 
    // There should be a valid (numeric) match in int at this point 
} 

는 단지로 이동하지 않고 문자열의 끝에서 직접 모든 숫자를 캡처해야 루프 및 말도 안되는 regexes.

여러 개의 값을 보려면 내부에서 반복하십시오.

관련 문제