Регулярное выражение, заменяющее числа, превышающие переменную в Javascript

#javascript #regex

#javascript #регулярное выражение

Вопрос:

У меня есть строка: «выбор 1 выбор 2 выбор 3 выбор 4»

Я ищу, чтобы удалить все слова, которые заканчиваются на число, большее переменной. Например:

 let str = "selection1 selection2 selection3 selection4";
let x = 2;
let regExp = RegExp(...);
let filtered = str.replace(regExp , ""); // should equal "selection1 selection2"
 

Я придумал следующее выражение, которое выбирает все слова, которые заканчиваются числами больше 29:

 /(selection[3-9][0-9]|[1-9]d{3}d*)/gi
 

Результатом этого регулярного выражения в строке «selection1 selection 40» является [selection40]

Я чувствую, что я часть пути туда.

Учитывая, что я имею дело с однозначными и двузначными числами и хочу включить переменную, какое регулярное выражение может помочь мне изменить эту строку?

Ответ №1:

Вы можете использовать .replace с обратным вызовом:

 let str = "selection5 selection1 selection2 selection3 selection4";
let x = 2;
let regex = /s*bw ?(d )b/g;
let m;

let repl = str.replace(regex, function($0, $1) {
  return ($1 > x ? "" : $0);
}).trim();

console.log( repl ); 

Регулярное /bw ?(d )b/g выражение сопоставляет все слова, заканчивающиеся цифрами 1 , и записывает цифры в группу захвата # 1, которую мы используем внутри функции обратного вызова для сравнения с переменной x .

Комментарии:

1. Отличный ответ! Одним из улучшений является замена нескольких пробелов только одним пробелом и удаление дополнительных пробелов в конце. Что-то вроде: repl.replace(/s /g, ' ').trim() .

2. Работает для меня! Он работает очень хорошо. Кроме того, @Khalid, спасибо за доработку!

3. @afriedman111 С удовольствием. Пожалуйста, обратите внимание, что вам понадобится replace() в следующем случае let str = "selection1 selection20 selection2 selection3";

4. Пожалуйста, обратите внимание, что я позаботился об удалении пробела в приведенном выше коде.

Ответ №2:

Вы можете разделить на пробелы, затем захватить группу, используя регулярное выражение, которое получает только числовую часть и фильтрует ее соответствующим образом.

 const str = "selection1 selection2 selection3 selection4";
const threshold = 2;

const pattern = /selection(d )/

const result = str
  .split(' ')
  .filter(x => Number(x.match(pattern)[1]) <= threshold)
  .join(' ');
  
console.log(result);