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,它必须基于行还是跨行工作?如果是后者,您的示例不太清楚。