正则表达式:不要从一开始就替换

时间:2014-01-04 16:12:20

标签: javascript jquery regex

我有piecherrypie等字符串。

如何替换字符串中pie的所有匹配项,而不是以pie开头?

这就是我现在所做的事情:

var regexp = new RegExp('pie', 'g');
var string = 'pie';
var string2 = 'cherrypie';
var cap = function(val) {
return val.charAt(0).toUpperCase()+val.slice(1);
}

console.log(string.replace(regexp, cap));
console.log(string2.replace(regexp, cap));

在线演示 - http://jsbin.com/ERUpuYuq/1/

只需打开控制台,您就会看到两行:

Pie 
cherryPie 

预期结果是

pie - since it starts with "pie" 
cherryPie 

我试图在我的正则表达式的开头添加*符号,没有任何运气。

如果我将.pie设置为我的正则表达式,我会得到:

pie 
cherrYpie 

解决方案将是regexp替换,它将捕获所有不在字符串的beginnign处的出现。

任何人都知道regexp?

注意:cap功能不应被修改。

2 个答案:

答案 0 :(得分:1)

您可以添加自己的有条件调用cap的函数,您声明无法修改。

var string = 'pie';
var string2 = 'cherrypie';
var string3 = 'piepie';
var cap = function(val) {
    return val.charAt(0).toUpperCase()+val.slice(1);
};
// Capture two arguments: $1 is optional and only set if the string begins with
// something.
var regexp = new RegExp('(.+)?(pie)', 'g');
var capCheck = function($0, $1, $2){
    // If $1 is set, return it plus the capitalised 'pie', otherwise return the
    // original string (no replacement).
    return $1 ? $1 + cap($2) : $0;
};

console.log(string.replace(regexp, capCheck));
// => pie
console.log(string2.replace(regexp, capCheck));
// => cherryPie
console.log(string3.replace(regexp, capCheck));
// => piePie

由于JavaScript RegExp中没有负面的lookbehind断言(我很遗憾),this answer给了我所需的解决方案。

More methods of mimicking lookbehind in JavaScript。关于使用前瞻,然后再次反转的字符串的一个是相当不错的,但这意味着你不能同时以正常的方式使用前瞻。

答案 1 :(得分:0)