繁体   English   中英

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

[英]Trying to capture enclosed string between asterisks **(str)**

我正在尝试将**SomeStr**替换为<b>SomeStr</b> 我几乎达到了我想要的。 我对下面的代码的主要问题是它捕获

**def*****yo**

分成 3 块**def** , * , **yo**当我认为它应该是**def** , ***yo**所以它会被转换成<b>def</b><b>*yo</b> 一个星号不应该结束比赛,但这就是正在发生的事情。

 const pattern = /(\\*\\*)([^\\*\\*]*)(\\*\\*)/g; let str = `* abc ** * **def****yo** *` const replacer = function(match, first, inner, last){ return "<b>"+inner+"</b>" } str = str.replace(pattern, replacer) console.log(str)

我希望我知道要摆弄什么。

您可以使用

 var str = " **def*****yo**"; var regex = /\\*\\*([^*]*(?:\\*(?!\\*)[^*]*)*)\\*\\*/g; var replacement = '<b>$1</b>'; console.log(str.replace(regex, replacement))

请参阅正则表达式演示

如果您只需要在行内匹配,而不需要跨换行符匹配,请将换行符添加到否定字符类并使用

var regex = /\*\*([^*\n]*(?:\*(?!\*)[^*\n]*)*)\*\*/g;

图案详情

  • \\*\\* - 一个**子串
  • ([^*]*(?:\\*(?!\\*)[^*]*)*) - 第 1 组:除星号 ( [^*]* ) 之外的零个或多个字符后跟零个或多个a *后面没有跟另一个*然后后面跟零个或多个星号以外的字符
  • \\*\\* - 一个**子串

替换模式中的$1代表组 1 值,无需在替换参数中使用可调用对象来访问组值。

目前,您的 Regex 表达式正在寻找两对星号“括起”一组 0 或更多除星号以外的任何东西(您在这里有两次,我认为在这样的集合中是多余的)。 这意味着您永远不会在匹配字符串的开头有一个“***”,因为根据您的正则表达式,星号不能位于两对星号之间。

如果您确实想在两对星号中匹配尽可能多的字符,您需要首先确保您没有将星号排除在中央组内的匹配之外。

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

https://regexr.com/非常有助于测试和使用 Regex 表达式,直到匹配您想要的短语。 刚开始弄乱你的虚拟文本, (\\*\\*)([.\\w\\*]+)(\\*\\*)/g似乎工作,但你需要更多地测试它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM