【问题标题】:replace all dashes but dash in phrase替换所有破折号,但短语中的破折号
【发布时间】:2026-01-13 22:35:02
【问题描述】:

我正在尝试用空格替换字符串中的所有破折号,除非破折号位于短语"not-replace" 中。所以整个字符串就像

var str = "change-these-dashes-but-not-replace-that";

所以我可以最终得到“更改这些破折号但不替换它”

但是我想出的与我不想替换它的短语中的破折号不匹配。我该如何修改它?:

.match(/-(^not-replace)/gi);

【问题讨论】:

  • 如何先替换所有破折号,然后将not replace 替换为not-replace
  • @elclanrs: var str = "change-these-dashed-bot-not-replace-that not replace";

标签: javascript regex


【解决方案1】:

这是另一种方法(如果使用,来自 ES5 的map 可以替换为来自 jQuery 的$.map):

str.split('not-replace').map(function(s) {
    return s.replace(/-/g, ' ');
}).join('not-replace');  // "change these dashes but not-replace that"

甚至更短且(可能)更快的解决方案:

str.replace(/-|not-replace/g, function(s) { return s === '-' ? ' ' : s; });

最后一个将在所有浏览器中持续工作。

【讨论】:

  • 您可以放心地去掉括号:/-|not-replace/
  • @thg435 当然。我什至不知道为什么要添加它们。也许我在考虑性能,但最后它没有任何意义,因为没有其他比赛。谢谢!
  • 我喜欢最后一张。很酷的想法。非常感谢!
【解决方案2】:
str.replace(/not-replace/, 'notXXXreplace').replace(/-/, ' ').replace(/notXXXreplace/, 'not-replace');

即首先保护not-replace,将其更改为不太可能不包含破折号的东西。然后替换所有破折号,并将not-replace 放回不太可能的字符串所在的位置。

【讨论】:

    【解决方案3】:

    现代 Javascript 现在支持后向断言,因此请相应地编辑我的旧答案。

    您可以将此正则表达式与嵌套的前瞻和后视一起使用:

    repl = str.replace(/-(?!(?<=\bnot-)replace\b)/g, ' ');
    //=> change these dashes but not-replace that
    

    RegEx Demo

    正则表达式详细信息:

    • -:匹配一个-
    • (?!: 开始负前瞻
      • (?&lt;=\bnot-): 前面必须有单词not-
      • replace\b:匹配词replace
    • ): 结束否定前瞻

    【讨论】:

    • notlook-behind 怎么样?
    • 是的!这是如何运作的?非常感谢。