Javascript RegExp и границы - PullRequest
2 голосов
/ 03 июня 2010

Коллега спросил меня о проблеме с регулярными выражениями, и я не могу найти и ответить за него.

Мы используем границы для выделения текста определенной длины в текстовом редакторе, но вот пример кода, который показывает проблему:

<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 ]

10 голосов
/ 03 июня 2010

Я предполагаю, что это не сработает, потому что вам нужно избежать обратной косой черты в вашей строке, которую вы передаете в RegExp. У вас есть это:

var rx = new RegExp('\bAlpha\b','gim');

Вам нужно это:

var rx = new RegExp('\\bAlpha\\b','gim');

Строка, которую вы передали в RegExp, содержит 2 символа возврата, так как \b является escape-последовательностью для вставки возврата в строку. Вы должны избегать каждого обратного слэша другим слэшем.

2 голосов
/ 03 июня 2010

Это строковая проблема. \b в строковом литерале является пробелом!

RegExp('\\bAlpha\\b','gim'); будет правильной формой

2 голосов
/ 03 июня 2010

RegExp должен иметь экранирующий символ:

new RegExp('\\bAlpha\\b')
1 голос
/ 03 июня 2010

Есть два способа написать ваши регулярные выражения в Javascript

  1. буквальный
  2. RegExp объект

В буквальном смысле вы используете, как вы узнали в своем учебнике, например, / Balabala / Но в объекте RegExp регулярное выражение записывается в виде строки.

Попробуйте следующие коды, вы знаете, какая строка ведет себя в JavaScript.

alert("O\K");
alert("O\\K");

Есть еще один случай, когда регулярное выражение записывается в текстовой области или в поле ввода. Например,

http://www.pagecolumn.com/tool/regtest.htm

В этом случае \ in Regexp не нужно экранировать.

0 голосов
/ 02 августа 2011

Фактически вы должны выполнить обратную косую черту в строке, переданной конструктору 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-"]
...