Javascript 试图捕获星号**(str)之间的封闭字符串**

Javascript 试图捕获星号**(str)之间的封闭字符串**,javascript,regex,Javascript,Regex,我正在尝试将**SomeStr**替换为SomeStr。我几乎实现了我想要的。下面代码的主要问题是它捕获了 **def*****yo** 分为三个部分,**def**,**,**yo**,当我认为它应该是**def**,***yo**时,它将被转换成def*yo。一个星号不应该结束比赛,但这就是正在发生的事情 const pattern=/(\*\*)([^\*\*]*)(\*\*)/g; 设str=`*abc** ***def****yo** *` 常量替换=函数(匹配、第一个、内部、最后

我正在尝试将
**SomeStr**
替换为
SomeStr
。我几乎实现了我想要的。下面代码的主要问题是它捕获了

**def*****yo**
分为三个部分,
**def**
**
**yo**
,当我认为它应该是
**def**
***yo**
时,它将被转换成
def*yo
。一个星号不应该结束比赛,但这就是正在发生的事情

const pattern=/(\*\*)([^\*\*]*)(\*\*)/g;
设str=`*abc**
***def****yo**
*`
常量替换=函数(匹配、第一个、内部、最后一个){
返回“+内部+”
}
str=str.replace(模式,替换)

console.log(str)
当前,您的正则表达式正在查找两对星号,它们“括住”一组0或更多的星号,而不是星号(这里有两个星号,我认为在这样的集合中是多余的)。这意味着匹配字符串的开头永远不会有“***”,因为根据正则表达式,星号不能位于两对星号之间

如果确实希望在两对星号中匹配尽可能多的字符,则需要首先确保不排除星号在中心组中的匹配

部分问题在于,您需要更仔细地思考您的逻辑-为什么当
**yo**
同样有效时,逻辑应该是
**yo**
(在这两种情况下,字符串都以两个星号开始和结束,而在第二种情况下,字符串实际上只以两个星号开始和结束,因此可以认为是一个更好的匹配)。我不确定您认为需要的逻辑是否是您实际需要的逻辑

对于测试和使用正则表达式非常有帮助,直到您匹配所需的短语为止。仅从最初乱搞伪文本开始,
(\*\*)([.\w\*]+)(\*\*)/g
似乎有效,但您需要对其进行更多测试。

您可以使用

var str=“**def*****yo**”;
var regex=/\*\*([^*]*(?:\*(?!\*)[^*]*)*)\*\*/g;
风险值替换='1美元';

console.log(str.replace(regex,replacement))
([^\*\*]*)
表示匹配0个或多个字符,这些字符不是
*
^
作为
[]
字符集的第一个字符表示在任何字符上都不匹配。仅当相同字符重复时,在集中包含两次不会使其不匹配。
*
as
\*
[^…]
括号内。请尝试
str.replace(/\**([^*]*(?:\*(?!\*)[^*]*)*)\*/g,$1')
@WiktorStribiżew这是一个非常好的解决方案是的,但我不确定-当前的示例字符串是基于行的,并且需要
str=str.replace(/\*\*([^*\n]*(?:\*(?!\*)[^*\n]*)\*\*/g,$1')
@PuffedRiceCrackers,它必须基于行还是跨行工作?如果是后者,您的示例不太清楚。