2011-12-16 4 views
2

У меня есть строка, содержащая цвет экранирующие последовательности, как это:Регулярное выражение, содержащее управляющую последовательность в JavaScript

"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); 
} 

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

+0

Это выглядит здорово, вы разделяя свой конечный продукт в любом месте? – mrtsherman

+0

Он находится на github через https://github.com/strathausen/culoare и на npm через 'npm install culoare' –

+1

Трудно видеть, что здесь происходит, особенно если вы не знакомы с coffeescript. Примером может служить пример с входными параметрами и выходом. Каково содержание 'o'? Что-то вроде '\ u001b [99m', поэтому' code' содержит только номер? Если да, то вы просто добавляете обратную косую черту перед '[', чтобы сделать это регулярным выражением. Это можно сделать другими способами, но зачем использовать регулярное выражение в этом случае? Вероятно, возможно, 'str.replace o, a'. – Qtax

ответ

1

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

How do I do global string replace without needing to escape everything?

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

Я собирался сделать что-то подобное, но в строке: 'new RegExp (sequence.replace (/ \ u001b \ [/ g, '\\ u001b \\ ['), 'g')' –

0

Исходное решение в OP довольно эффективно и имеет только две проблемы, как я вижу.

  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); 
} 
+0

Я использую CoffeeScript: -) нет глобальных утечек из-за неявного var. –

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