function strip(match, before, after) {
return before && after ? ' ' : ''
}
var regex = /(^|\s)(?:y|x)(\s|$)/g
var str = ('x 1 y 2 x 3 y').replace(regex, strip)
console.log(str)
str = ('x y 2 x 3 y').replace(regex, strip)
console.log(str)
目标是删除所有出现的“x”和“y”。
第一个示例按预期工作,但第二个示例不工作。
要求:
解决方案必须支持删除任何长度的单词。
单词之间绝不能有超过1个空格。
避免删除包含“x”或“y”(必须相等)的单词。
我可以使用replace
解决此问题,还是需要其他解决方案?
答案 0 :(得分:2)
你不能两次匹配同一个角色(匹配结束时的空格字符,当子串连续时,在下一个匹配开始时不能再匹配一次)
避免这种情况的一种可能方法是将( |$)
更改为检查空间而不消耗空间的预测。但是你需要改变你的方法,因为你必须在结束或开始时修剪最终的剩余空间:
var regex = /(^|\s)(?:y|x)(?!\S)/g;
var str = 'x y 2 x 3 y'.replace(regex, '').trim();
(?!\S)
表示:后面没有非空格字符(如果位置后跟空格或字符串末尾,则成功)。
其他方式:您可以匹配所有连续的x和y。
function strip(match, before, after) {
return before && after ? ' ' : ''
}
var regex = /(^|\s)(?:y|x)(?:\s(?:y|x))*(\s|$)/g;
var str = 'x y 2 x 3 y'.replace(regex, strip);
拆分字符串:
var str = 'x y 2 x 3 y'.split(/\s+/).filter(a => !['x', 'y'].includes(a)).join(' ');
答案 1 :(得分:0)
我用3个替换语句完成了它:
('x y 2 x 3 y 4 x').replace(/\b[xy]\b/g, "").replace(/\b\s\s+\b/g, ' ').replace(/^\s+|\s+$/g, "")
编辑:最后一个可以替换为.trim()
答案 2 :(得分:-1)
我解决了另一种不使用trim()的方式:
('x 1 y 2 x 3 y 4 x').replace(/(^|\s?)(?:y|x)(\s?|$)/g, strip)
function strip(match, before, after) {
return before && after ? ' ' : ''
}
console.log("With 1: ", ('x 1 y 2 x 3 y 4 x').replace(/(^|\s?)(?:y|x)(\s?|$)/g, strip))
console.log("With 1: ", ('x y 2 x 3 y 4 x').replace(/(^|\s?)(?:y|x)(\s?|$)/g, strip))