Регулярное выражение, содержащее escape-последовательность в JavaScript - PullRequest
2 голосов
/ 16 декабря 2011

У меня есть строка, содержащая цветовые escape-последовательности, например:

"white text \x1b[33m yellow text \x1b[32m green text"

Теперь мне нужно заменить все вхождений определенной escape-последовательности. Я получу только последовательность побега, которую я буду искать, вот что у меня есть. Насколько я знаю, единственный способ в JavaScript заменить все вхождения чего-либо - это использовать регулярные выражения.

// replace all occurences of one sequence string with another
function replace(str, sequence, replacement) {
  // get the number of the reset colour sequence
  code = sequence.replace(/\u001b\[(\d+)m/g, '$1');
  // make it a regexp and replace all occurences with the start colour code
  return str.replace(new RegExp('\\u001b\\[' + code + 'm', 'g'), replacement);
}

Итак, я получаю escape-последовательность, которую хочу найти, затем использую регулярное выражение, чтобы получить число из этой последовательности, просто для создания другого регулярного выражения, которое будет искать escape-последовательность. Разве нет более простого и приятного пути?

Ответы [ 2 ]

1 голос
/ 16 декабря 2011

Если ваша проблема в том, о чем я думаю, я думаю, что более простой и приятный способ - просто покинуть ваш шаблон и передать его непосредственно конструктору RegExp, как видно из моего старого вопроса

Как мне выполнить глобальную замену строки, не убирая все?

function escape(s) {
    return s.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&')
};

function replace_all(str, pattern, replacement){
    return str.replace( new RegExp(escape(pattern), "g"), replacement);
}

replace_all(my_text, "\x1b[33m", "REPLACEMENT")
0 голосов
/ 16 декабря 2011

Исходное решение в ОП довольно эффективно и, на мой взгляд, имеет только две проблемы.

  1. Оператору "code = ..." требуется var - как он загрязняет глобальное пространство имен.
  2. Оператор "code = ..." нуждается в некоторой проверке ошибок для обработки неправильного sequence ввода.

Вот как я могу улучшить это:

// replace all occurrences of one ANSI escape sequence with another.
function replace(str, sequence, replacement) {
  // Validate input sequence and extract color number.
  var code = sequence.match(/^\x1b\[(\d+)m$/);
  if (!code) {  // Handle invalid escape sequence.
    alert('Error! Invalid escape sequence');
    return str;
  }
  // make it a regexp and replace all occurrences with the start color code
  return str.replace(new RegExp('\\x1b\\[' + code[1] + 'm', 'g'), replacement);
}
...