【问题标题】:Replacing substring in a numeric pattern替换数字模式中的子字符串
【发布时间】:2020-07-04 00:21:31
【问题描述】:

我有一个字符串

text *inner text 1* text2 *inner text 2*

我必须用<span></span>替换子字符串

输出

text <span>inner text 1</span> text2 <span>inner text 2</span>

我试过了

replace(/[*]/g,"<span>")

我知道使用 /g 会用 &lt;span&gt; 替换所有出现的事件,而且我不能将两个参数放入替换中,所以问题是如何用 &lt;/span&gt; 替换 每个偶数事件 p>

【问题讨论】:

  • 你有没有试过用自己的正则表达式分别捕捉“space*”和“*space”?
  • 诀窍是在捕获正则表达式组时使用反向引用。 javascript.info/regexp-backreferences 有一个使用引号的示例。让我试着想出一个与您的用例相匹配的答案。
  • @Ryuno-Ki - 正则表达式在这里可能是一个很好的答案,但我认为您不需要反向引用...?

标签: javascript regex replace


【解决方案1】:

正则表达式

\*([^\*]+)\*

let str = 'text *inner text 1* text2 *inner text 2*'

console.log(str.replace(/\*([^\*]+)\*/g, '<span>$1</span>'))

演示

https://regex101.com/r/wj9WkA/1/

【讨论】:

    【解决方案2】:

    您可以使用计数器和余数运算符,对replace 进行回调:

    let counter = 0;
    result = original.replace(/[*]/g, () => ++counter % 2 ? "<span>" : "</span>");
    

    现场示例:

    const original = "text *inner text 1* text2 *inner text 2*";
    let counter = 0;
    const result = original.replace(/[*]/g, () => ++counter % 2 ? "<span>" : "</span>");
    console.log(result);

    因为1 % 21 这是真的,但2 % 20 这是假的,3 % 21 这是真的...

    另一种方法是使用正则表达式来搜索两个* 之间的匹配项,使用捕获组来捕获匹配项:

    result = original.replace(/\*(.*?)\*/g, "<span>$1</span>");
    

    现场示例:

    const original = "text *inner text 1* text2 *inner text 2*";
    let counter = 0;
    const result = original.replace(/\*(.*?)\*/g, "<span>$1</span>");
    console.log(result);

    这是假设纯粹基于交替 * 字符来工作真的没问题。

    【讨论】:

      【解决方案3】:

      基于https://stackoverflow.com/a/1234725/5189920的简答:

      var string = 'text *inner text 1* text1 *inner text 2* text2';
      var newString = string.replace(/\*([\w\s]+[^*])\*/g, '<span>$1</span>');
      console.log(newString);

      说明:正则表达式正在搜索文字星号 (\*),后跟捕获组 ((...))。这个组可以被$1 在第二个参数中引用。在其中,我们将捕获所有单词 (\w) 和空格 (\s),直到下一个星号 ([^*])。搜索适用于全球 (/g)。

      第二个参数引用了捕获的组并替换了它周围的部分 (\*)。

      【讨论】:

        【解决方案4】:

        你可以使用:

        str.replace(/([*])([\w ]+)\1/g, '<span>$2</span>');
        

        正则表达式详细信息:

        • ([*]) 匹配 * 并在 #1 组中捕获
        • ([\w ]+) 匹配 1+ 个单词或空格字符并在组 #2 中捕获
        • \1 用于使字符串以与组#1 中相同的* 结尾
        • 替换为&lt;span&gt;$2&lt;/span&gt; 以将&lt;span&gt;&lt;/span&gt; 中的组#2 中的字符串包装起来

        演示:

        const str = 'text *inner text 1* text2 *inner text 2*';
        
        const res = str.replace(/([*])([\w ]+)\1/g, '<span>$2</span>');
        
        console.log(res);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-26
          • 2012-04-03
          • 2013-07-23
          相关资源
          最近更新 更多