我试图用空格替换字符串中的所有破折号,除非破折号在短语中"not-replace"
。所以整个字符串就像
var str = "change-these-dashes-but-not-replace-that";
所以我最终可能会得到“更改这些破折号但不替换那个”
但是我想出的与我不想替换它的短语中的破折号不匹配。我该如何修改它?:
.match(/-(^not-replace)/gi);
我试图用空格替换字符串中的所有破折号,除非破折号在短语中"not-replace"
。所以整个字符串就像
var str = "change-these-dashes-but-not-replace-that";
所以我最终可能会得到“更改这些破折号但不替换那个”
但是我想出的与我不想替换它的短语中的破折号不匹配。我该如何修改它?:
.match(/-(^not-replace)/gi);
现代 Javascript 现在支持后向断言,因此可以相应地编辑我的旧答案。
您可以将此正则表达式与嵌套的前瞻和后视一起使用:
repl = str.replace(/-(?!(?<=\bnot-)replace\b)/g, ' ');
//=> change these dashes but not-replace that
正则表达式详细信息:
-
: 匹配一个-
(?!
: 开始负前瞻
(?<=\bnot-)
: 必须以单词开头not-
replace\b
: 匹配词replace
)
: 结束负前瞻str.replace(/not-replace/, 'notXXXreplace').replace(/-/, ' ').replace(/notXXXreplace/, 'not-replace');
即首先not-replace
通过将其更改为不太可能不包含破折号的东西来保护。然后替换所有破折号,并放回not-replace
不太可能的字符串所在的位置。
这是另一种方法(如果使用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; });
最后一个将在所有浏览器中持续工作。