2014-01-04 2 views
-1

У меня есть строки, такие как pie и cherrypie.Regexp: не заменить с начала

Как заменить все вхождения 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 

Решения будет замена регулярных выражений, который будет ловить все, что места где размещаются не на beginnign строки.

Кто-нибудь знает regexp?

Примечание: cap функция не должна изменяться.

ответ

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 (я есть грустный), this answer дал мне решение, необходимое.

More methods of mimicking lookbehind in JavaScript. Тот, кто обратил вспять строку, используя lookahead, а затем снова обратный, был довольно приятным, но это означает, что вы не можете использовать lookahead обычным способом в одно и то же время.

0

Например, вы можете попробовать точку. http://jsbin.com/ERUpuYuq/3/edit?html,js,console,output

+0

Я не могу использовать это, так как функция 'cap' является глобальной. – Jasper

+0

Что это значит, что функция глобальна? –

+0

Эта функция просто используется другим кодом. Создание еще одного клона с модификацией «slice» превратит мой код в макароны. – Jasper

Смежные вопросы