2015-06-23 2 views
1

В строке ниже я хочу найти, например, все, что угодно между '[' и 'A'. Здесь 'match1', 'match2', 'match3'. И чем заменить каждый матч, например, «проверить».От 'one behind' до 'one before' (между)

var str = "+dkdele*[match1Ayesses ss [match2Aevey[match3A"; 
var pattern = /(?=\[)(.*?)([]?A)/g; // includes '[' and 'A' 
var res = str.replace(pattern, "check"); // could be '[checkA' 
console.log(res); 

Шаблон включает в себя '[' и 'A', что я не хотите. Как может выглядеть шаблон, который соответствует между двумя любыми желаемыми Знаками?

+1

Обратите внимание, что ответ anubhava также предоставляет полезный сайт, на котором вы можете протестировать код RegEx: [Regular Expression 101] (https://regex101.com/) – Roberto

+0

Я знаю этот сайт. Спасибо! – Sun

ответ

1

Вы можете использовать:

var pattern  = /(\[).*?(A)/g; 
var replacement = "check"; 
var res   = str.replace(pattern, '$1' + replacement + '$2'); 

Регулярное выражение:

  • (\[) - сопоставить открытую квадратную скобку и зафиксировать совпадение в первой группе.
  • .*? - соответствует минимально возможной нулевой или-более любых символов
  • (A) - тогда совпадать с A и захватить его во второй группе.

Замена поместит в первой и второй групп захвата вместо $1 и $2 (соответственно).

С любого начала и конца матчей вы можете сделать:

var start  = "\\["; 
var end   = "A"; 
var pattern  = new RegExp("(" + start + ").*?(" + end + ")", "g"); 
var replacement = "check"; 
var res   = str.replace(pattern, '$1' + replacement + '$2'); 

Если вы не хотите, чтобы включить начальный и конечный матч символы, то не включают группы захвата в замене:

var res   = str.replace(pattern, replacement); 
3

Вы можете использовать это регулярное выражение:

/\[(\w+)(?=A)/g 

и захватить в плен группу # 1

RegEx Demo

Если может быть больше, чем слово символов, то используйте:

/\[([^A]+)(?=A)/g 

Код:

var re = /\[([^A]+)(?=A)/g; 
var str = '+dkdele*[match1Ayesses ss [match2Aevey[match3A'; 
var m;  
while ((m = re.exec(str)) !== null) { 
    if (m.index === re.lastIndex) 
     re.lastIndex++; 
    console.log(m[1]); 
} 

Выход:

match1 
match2 
match3 

EDIT: на основе отредактированной вопрос и комментарий ниже:

Для замены можно использовать:

var repl = str.replace(/(\[)[^A]+(?=A)/, '$1check'); 
//=> +dkdele*[checkAyesses ss [checkAevey[checkA 

PS: Если вы хотите A также быть заменен затем использовать:

var repl = str.replace(/(\[)[^A]+A/, '$1check'); 
//=> +dkdele*[checkyesses ss [checkevey[check 
+0

Спасибо за ваш ответ! Я забыл сказать, что хочу заменить матч. Вопрос редактируется. – Sun

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