2010-06-03 4 views
2

Коллега спросил меня о проблеме с регулярным выражением, и я не могу найти и ответить за него.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, кто-нибудь знает почему?

ответ

10

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

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

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

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

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

+0

Doh, конечно; Благодаря! –

+0

Также отсутствует захват parens: \\ b (Alpha) \\ b –

+0

yup, у меня был Doh, пока я не увидел этот ответ. У thx – CommentLuv

2

RegExp должен иметь характер побег спасся:

new RegExp('\\bAlpha\\b') 
2

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

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

1

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

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

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

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

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

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

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

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

0

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