【问题标题】:RegEx for replacing the middle letter [closed]用于替换中间字母的正则表达式 [关闭]
【发布时间】:2019-05-31 00:57:26
【问题描述】:

无效的正则表达式:无效组

我尝试了 except () ,修复并更改了。到 $ 但不起作用

var name = 'ABC'
var pattern = /(?<=.{1})./
return name.replace(pattern, " * ")

我想替换为 'A*C'

无效的正则表达式:无效组

【问题讨论】:

  • 您使用的是哪个浏览器?一些浏览器仍然不支持负回溯,当你想替换一个字符时,你能添加更多的示例输入和输出和规则
  • @CodeManiac 我使用 chrome 和 safari,但不能仅在 safari 中工作。
  • 目前 safari 不支持它,请参阅 list
  • @CodeManiac 这是一个错误信息更多语法错误:无效的正则表达式:没有什么可重复的代码只是这样
  • @CodeManiac 我明白了.. safari 不受支持。谢谢 怎么解决?你能帮忙吗?

标签: javascript regex string regex-lookarounds regex-group


【解决方案1】:

您的模式使用了浏览器支持有限的lookbehind。

如果支持lookbehind,则模式(可以缩短为(?&lt;=.).,如果左边是任何字符,则将匹配任何字符。

这将匹配 ABC 中的 B,但也匹配 ABCD,因此 is 不匹配中间字符。

另一种选择是使用:

^(.).(?=.$)

在替换使用中(没有前导和尾随空格):

$1*

注意. 匹配除换行符以外的任何字符,因此它也匹配空格。如果您不想匹配空格,可以改用\S

var name = 'ABC';
var pattern = /^(.).(?=.$)/;
console.log(name.replace(pattern, "$1*"));

您可以在没有正则表达式的情况下替换中间字符:

let strings = [
  "A",
  "AB",
  "ABC",
  "ABCD",
  "ABCDE",
  "ABCDEF",
  "ABCDEFG",
  "ABCDEFGH",
  "ABCDEFGHI"
].reduce(function(a, c) {
  if (c.length % 2 === 1) {
    let evenHalf = (c.length - 1) / 2;
    a.push(c.substr(0, evenHalf) + '*' + c.substr(evenHalf + 1));
  }
  return a;
}, []);

console.log(strings);

【讨论】:

    【解决方案2】:

    这里我们可能只想使用开始和结束锚点并编写一个简单的表达式,例如:

    ^([A-Z]).([A-Z])$
    

    替换为:

    $1*$2
    

    const regex = /^([A-Z]).([A-Z])$/gm;
    const str = `ABC`;
    const subst = `$1*$2`;
    
    // The substituted value will be contained in the result variable
    const result = str.replace(regex, subst);
    
    console.log(result);

    Demo

    正则表达式

    如果不需要此表达式,可以在 regex101.com 中修改/更改。

    正则表达式电路

    jex.im 可视化正则表达式:

    【讨论】:

      【解决方案3】:

      如果 'ABC' 变成 A * C 或 CDE 变成 C * E,你可以使用 substr.. :)

      function run(){
        var s = "ABC";
        var index = 1;
        s = s.substr(0, index) + ' * ' + s.substr(index + 1);
        alert(s);
      }
      <html>
      <head>
        <meta charset="utf-8">
        <meta name="viewport" content="width=device-width">
        <title>JS Bin</title>
      </head>
      <body>
        <button onclick="run()">Test</button>
      </body>
      </html>

      【讨论】:

        【解决方案4】:

        带有捕获组的正则表达式解决方案:

        var name = 'ABC';
        var pattern = /(.)./;
        return name.replace(pattern, "$1 * ")
        

        与第一个括号匹配的内容可通过$1 在替换参数中获得。

        快速测试:

        var name = 'ABC'
        var pattern = /(.)./
        console.log(name.replace(pattern, "$1 * "))

        【讨论】:

          猜你喜欢
          • 2016-11-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-01-02
          • 1970-01-01
          • 2012-12-07
          • 1970-01-01
          相关资源
          最近更新 更多