1

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

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

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

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

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

3 回答 3

2

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

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

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

正则表达式演示

正则表达式详细信息:

  • -: 匹配一个-
  • (?!: 开始负前瞻
    • (?<=\bnot-): 必须以单词开头not-
    • replace\b: 匹配词replace
  • ): 结束负前瞻
于 2013-11-11T22:22:57.537 回答
2
str.replace(/not-replace/, 'notXXXreplace').replace(/-/, ' ').replace(/notXXXreplace/, 'not-replace');

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

于 2013-11-11T22:25:58.863 回答
2

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

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; });

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

于 2013-11-11T22:33:20.083 回答