我正在解决一个需要替换负的正则表达式的问题。在javascript中替换负数正则表达式的函数
如果我有一个字符串text
,正则表达式模式re
和转换函数f
我想有一个negativeReplace
函数替换所有不text
串通过应用匹配re
模式子串转换功能f
,并保持其余。
# input
var text = " aa (bb) cc ";
var re = /[\(].*?[\)]/g;
var f = function(s){ return s.toUpperCase() }
# expected output
negativeReplace(text, re, f)
# -> " AA (bb) CC "
这是我最好的尝试,到目前为止
function negativeReplace(text, re, f){
var output = ""
var boundary = 0;
while((match = re.exec(text)) != null){
output += f(text.slice(boundary, match.index)) + match[0];
boundary = match.index + match[0].length;
}
output += f(text.slice(boundary, text.length));
return output;
}
它的工作!
function negativeReplace(text, re, f){
var output = ""
var boundary = 0;
while((match = re.exec(text)) != null){
output += f(text.slice(boundary, match.index)) + match[0];
boundary = match.index + match[0].length;
}
output += f(text.slice(boundary, text.length));
return output;
}
var text1 = " aa (bb) cc ";
var text2 = " aa { bb } cc { dd } ee ";
var f1 = function(s){ return s.toUpperCase() }
var f2 = function(s){ return "_" + s + "_" }
re = /[\({].*?[\)}]/g
console.log(negativeReplace(text1, re, f1)) // AA (bb) CC
console.log(negativeReplace(text2, re, f1)) // AA { bb } CC { dd } EE
console.log(negativeReplace(text1, re, f2)) // _ aa _(bb)_ cc _
console.log(negativeReplace(text2, re, f2)) // _ aa _{ bb }_ cc _{ dd }_ ee
但是,我似乎实现太复杂。因为JavaScript已经有replace
功能,与匹配模式。并用negative regex
这样的简单情况替换为用空白替换除了数字以外的所有字符,在this post中有解决办法。
所以我的问题是我怎样才能更好地解决这个问题(我可以使用replace
为此,我怎样才能改善我的代码)。
非常感谢。
链接的帖子并不是真正的“负面”正则表达式,因为该解决方案使用正则匹配个别字符的正则表达式进行替换。您的要求并不属于同一类别。 – nnnnnn
您是否需要为*特定表达式*或* any *表达式执行此操作?而且你正在替换*表达式匹配的部分字符串,所以目前还不清楚你在这里做了什么。 –
@ T.J.Crowder在我的问题中,我必须多次使用这个函数。 *这个特定的表达式*仅仅是一个简单的测试用例来描述我的问题。我**做**替换**不匹配**表达式的所有子字符串。请仔细看看我的代码,并且在我写和这篇文章时与一些测试用例一起工作。非常感谢你 –