如何仅在特定范围内应用正则表达式,例如两个**
之间?
我想用JavaScript来改变这个
**
_a_ _b_ _c_
-d- -e- -f-
**
_a_
进入这个
**
{a} {b} {c}
(d) (e) (f)
**
_a_
请注意,所需的结果是_a_
不会在"范围"之外更改。
我可以做这么多
str
.replace(/_(.*?)_/g, "{$1}")
.replace(/-(.*?)-/g, "($1)")
但这将取代所有地方,甚至在两个**
之外。
答案 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);