Javascript RegExp и границы
Коллега спросил меня о проблеме с регулярными выражениями, и я не могу найти и ответить за него.
Мы используем границы, чтобы выделить текст определенной длины в текстовом редакторе, но вот пример кода, который показывает проблему:
<script type="text/javascript">
var str = "Alpha , Beta, Gamma Delta Epsilon, AAlphaa, Beta Alpha<br/>";
var rx = new RegExp('\bAlpha\b','gim');
document.write(str.replace(/\b(Alpha)\b/gim, '-- $1 --'));
document.write(str.replace(rx, '== $1 =='));
</script>
Проблема в том, что первый литерал str.replace работает, а опция RegExp - нет.
У меня такое же поведение в IE и FF, кто-нибудь знает почему?
5 ответов
Я предполагаю, что это не сработает, потому что вам нужно избежать обратной косой черты в вашей строке, которую вы передаете в RegExp. У вас есть это:
var rx = new RegExp('\bAlpha\b','gim');
Ты нуждаешься в этом:
var rx = new RegExp('\\bAlpha\\b','gim');
Строка, которую вы передали в RegExp, содержит 2 символа возврата, так как \b
это escape-последовательность для вставки возврата в строку. Вы должны избегать каждого обратного слеша другим.
Это вопрос строки. \b
в строковом литерале это забой!
RegExp('\\bAlpha\\b','gim');
будет правильная форма
RegExp должен иметь экранирующий символ:
new RegExp('\\bAlpha\\b')
Есть 2 способа написать ваши регулярные выражения в Javascript
- буквальный
- RegExp объект
В буквальном смысле вы используете, как вы узнали из своего учебника, например / balabala /. Но в объекте RegExp регулярное выражение записывается в виде строки.
Попробуйте следующие коды, вы знаете, какая строка ведет себя в JavaScript.
alert("O\K");
alert("O\\K");
Есть еще один случай, когда Regexp написан в текстовой области или в поле ввода. Например,
http://www.pagecolumn.com/tool/regtest.htm
В этом случае \ in Regexp не нужно экранировать.
На самом деле вы должны выполнить обратную косую черту в строке, переданной в конструктор RegExp:
var re = /my_([\w_]+-\d-)regexp/
эквивалентно:
var re = new RegExp("my_\(\[\\\w_\]+-\\\d-\)regexp")
И оба соответствуют следующему глупому примеру:
"my_very_obvious-4-regexp".match(re)
["my_very_obvious-4-regexp", "very_obvious-4-"]