2016-07-20 3 views
-1

В службе node.js я хочу выполнить замену внутри строки, где результирующая строка зависит от числового значения внутри исходной строки. Я должен использовать string.prototype.replace, и я должен сделать это за один шаг, это условия, поэтому, пожалуйста, не спрашивайте, почему.Условное регулярное выражение JavaScript

var original = "blah/XX/blah"; //XX stands for 00-99 
var regexp = new RegExp(/blah\/(d{2})\/blah/, "g"); 
var alternate = "mama$1/mia"; 
var result = original.replace(regexp, alternate); 

Ожидаемый результат:

XX == 01 => mama/mia 
XX > 01 => mamaXX/mia 

Как это сделать?

+0

любая строка, которую вы хотите вернуть маме (XX)/mia, заменяя начальную строку? – eltonkamami

+0

Кстати: вам не нужно использовать конструктор RegExp в этом случае, поскольку строка, передаваемая конструктору, является статической, а не динамической. – hindmost

+0

Используйте метод сопоставления строк, а затем используйте оператор if для выполнения разных замещений на основе результата этого оператора if. – evolutionxbox

ответ

1

Вы можете сделать это с не захватывая группы и чередованием: var regexp = new RegExp(/blah\/(?:(01)|\d{2})\/blah/, "g");

Объяснение:

  • (?:...) не является захват группы, так что это не влияет на $1.
  • (?:(...)|...) - не захватывающая группа с двумя альтернативами. Первая альтернатива сохраняется до $1. Второй не сгруппирован.
  • 01|\d{2} является альтернативой. 01 будет соответствовать обоим, но двигатель регулярного выражения останавливается в первом матче.

Вы можете играть с этим на this fiddle.

+1

Отличная идея, хотя ваш ответ дал мне противоположность тому, что мне было нужно. Используя вашу мысль, это решает проблему: 'var regexp = new RegExp (/ blah \/(?: (01) | (\ d {2})) \/blah /, "g"); ' ' var alternate = "mama $ 2/mia"; ' – Dondey

+1

Вам не нужно записывать' (01) ', вы можете использовать 'var regexp = new RegExp (/ blah \/(?: 01 | (\ d {2})) \/blah /," g "); var alternate = "mama $ 1/mia"; ' –

1

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

var original = "blah/01/blah"; //XX stands for 00-99 
 
var regexp = /blah\/(\d{2})\/blah/g; 
 
var result = original.replace(regexp, function($0, $1) { 
 
    return $1 !== "01" ? "mama" + $1 + "/mia" : "mama/mia"; 
 
}); 
 
console.log(result);

С /blah\/(\d{2})\/blah/g мы сопрягать все подстроки, начиная с blah/, то есть 2 цифры и /blah, а затем проверьте, превышает ли это число 1, мы объединяем "mama", номер и "/mia". Если это 1 или 0, мы возвращаем только "mama/mia".

Just FYI: у вас была опечатка в регулярном выражении, \d соответствует цифрам, а не только d.

+0

правда, я пропустил ввод текста в обратную косую черту перед совпадением цифр – Dondey

+0

Теперь я понимаю, что вы имели в виду. Я обновил ответ, поэтому теперь он решает вашу проблему одинаково хорошо. Использование метода обратного вызова внутри 'replace' является гибким решением, но вам может не понадобиться такая гибкость. В любом случае, это более читаемо, чем захват внутри группы, не участвующей в чередовании. –

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