仅在"范围"内应用正则表达式替换;

时间:2017-08-09 15:59:58

标签: javascript regex

如何仅在特定范围内应用正则表达式,例如两个**之间?

我想用JavaScript来改变这个

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

进入这个

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

请注意,所需的结果是_a_不会在"范围"之外更改。

我可以做这么多

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

但这将取代所有地方,甚至在两个**之外。

3 个答案:

答案 0 :(得分:4)

实现此目的的一种方法是对我来说更简单的是在分隔符**中提取字符串,并将其替换为现有的正则表达式(已经有效)。

<强> E.g。

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

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

console.log(result);

答案 1 :(得分:0)

我会使用与@choz相同或类似的解决方案:

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);

答案 2 :(得分:0)

能够对单个正则表达式进行作用域划分对我来说很重要。因此,实际上有可能要感谢lookbehind

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


var pattern1 = /(\*\*((?<!\*\*).|\n)*?)_(.*?)_((.|\n)*?\*\*)/g;
var pattern2 = /(\*\*((?<!\*\*).|\n)*?)-(.*?)-((.|\n)*?\*\*)/g;

var result = str;

while(result.match(pattern1) != null)
{
    result = result.replace(pattern1, "$1{$3}$4");
}
while(result.match(pattern2) != null)
{
    result = result.replace(pattern2, "$1($3)$4");
}

console.log(result);