2016-10-10 2 views
0

달러 기호 간 텍스트 일치를 바꾸려고합니다.정규식으로 일치 항목 바꾸기

$match$Some text and $some text that matches$. 안의 텍스트를 바꿔야합니다.

나는

이 작동
text.replace(/\$.*?\$/g, function (match) { 
    return '_' + match + '_'; 
} 

을 시도했습니다. 문제는이 함수 내부에서 일치 항목을 평가하기를 원하지만, 때로는 평가가 작동하지 않는 경우이며,이 경우 원래 일치 항목을 반환하기를 원합니다. 그래서 그것은 비슷합니다.

text.replace(/\$.*?\$/g, function (match) { 
    try { 
    return evaluate(match); 
    } catch (e) { 
    return match; 
    } 
} 

그러나 현재의 정규식에서는 일치하는 원본 텍스트의 달러 기호가 포함되어 있습니다. 달러 기호를 생략하고 싶지만 평가가 실패하면 원래 달러 기호를 다시 원합니다. 내가 할 수있는 무엇

text.replace(/\$.*?\$/g, function (match) { 
    try { 
    return evaluate(match.replace(/\$/g, '')); 
    } catch (e) { 
    return match; 
    } 
} 

이지만 더 우아한 방법으로 가능하지 않다? 이 같은

+1

try..catch 이외에 괜찮은 것 같다면, 오류를 던지는 대신에'evaluate' 함수에서 무엇인가를 반환해야합니다. – adeneo

답변

1

뭔가 할 수 있습니다

const evaluate = function(str) { 
    if (str && str.startsWith("t")) {return str.toUpperCase();} 
    throw "Gotta hava a 'T'"; 
}; 

"ab$test$cd $something$ that is $tricky$.".replace(/\$([^$]*)\$/g;, function(str, match) { 
    try { 
     return evaluate(match); 
    } catch(e) { 
     return str; 
    } 
}); //=> "abTESTcd $something$ that is TRICKY." 

하지만 난 당신이 더 나은 오히려이 경우에 던지는 것보다 evaluate에서 다른 신호 (undefinednull을?) 반환 될 수있는 의견에 동의합니다. /\$([^$]*)\$/g;, 교체 함수에 매개 변수가된다 :

 return evaluate(match) || str; 

점 정규식에서 캡처 그룹이다 : 그리고 함수 본문은 단순히 같은 것이 될 수 있습니다.

관련 문제