2017-08-09 18 views
2

如何才能在特定範圍內應用正則表達式,如兩個**之間的正則表達式?僅在「範圍」內使用正則表達式替換

我想用JavaScript來改變這種

** 
    _a_ _b_ _c_ 
    -d- -e- -f- 
** 
_a_ 

這個

** 
    {a} {b} {c} 
    (d) (e) (f) 
** 
_a_ 

注意,理想的結果是,_a_不是「範圍」之外的變化。

我可以做這麼多

str 
    .replace(/_(.*?)_/g, "{$1}") 
    .replace(/-(.*?)-/g, "($1)") 

但這將取代無處不在,即使外兩**的的。

回答

3

實現這一點的一種方法是,對我來說更簡單的方法是提取分隔符**內的字符串,並將其替換爲現有的正則表達式(它已工作)。

E.g.

var str = `** 
 
    _a_ _b_ _c_ 
 
    -d- -e- -f- 
 
** 
 
_a_`; 
 

 
var result = str.replace(/\*\*(\s|.)+\*\*/g, function (x) { 
 
\t return x 
 
      .replace(/_(.*?)_/g, "{$1}") 
 
      .replace(/-(.*?)-/g, "($1)"); 
 
}); 
 

 
console.log(result);

+0

感謝。我不知道'.replace()的第二個參數可能是一個函數。這使得一切都更容易。 – Travis

0

爲@choz做我會用相同或simular解決方案:

var str = "_a_\n**_a_ _b_ _c_\n-d- -e- -f-** \n_a_ \n**_a_ _b_ _c_-d- -e- -f-**_a_"; 
 

 
// split into parts 
 
var parts = str.split(/(\*\*)/); 
 

 
var shouldReplace = false; 
 
var buffer = ""; 
 

 

 
// go tough all values 
 
parts.forEach((value) => { 
 

 
    // negate shouldReplace if delimter 
 
    if (value === "**") { 
 
    buffer += value; 
 
    shouldReplace = !shouldReplace; 
 
    return; 
 
    } 
 

 
    // if not shouldReplace add to buffer 
 
    if (!shouldReplace) { 
 
    buffer += value; 
 
    return; 
 
    } 
 

 
    // replace the value if shouldReplace 
 
    buffer += value 
 
       .replace(/_(.*?)_/g, "{$1}") 
 
       .replace(/-(.*?)-/g, "($1)") 
 
}); 
 

 
console.log(buffer);