2012-02-29 2 views
1

Я пытаюсь создать регулярное выражение, которое легко заменит входное имя, такое как «отверстия [0] [снимки] [0] [единица]» на «отверстия [0] [снимки] 1 [единица ]». Я в основном клонирую вход HTML и хотел бы убедиться, что его позиция увеличивается.Javascript regex grouping

Я получил мое регулярное выражение построен и работает правильно с помощью этого (удивительный) инструмент: http://gskinner.com/RegExr/

Вот мой текущий регулярное выражение:

(.*\[shots\]\[)([0-9]+)(\].*\]) 

и я использую заменить такие как:

$12$3 

это преобразует «отверстия [0] [выстрелы] [0] [единица]« в »отверстия [0] [выстрелы] [2] [единица]». Это именно то, чего я хочу. Однако, когда я пытаюсь это в JavaScript (http://jsfiddle.net/PH2Rh/):

var str = "holes[0][shots][0][units]"; 
var reg =new RegExp("(.*\[shots\]\[)([0-9]+)(\].*\])", "g"); 

console.log(str.replace(​reg,'$1'));​​​​​​​​​​​​​​​​​​​​​​​​ 

я получаю следующий вывод: отверстия [0

Я не понимаю, как моя первая группа должна представлять «дыру [0» , так как я включил целые [выстрелы] [часть в нем.

Я ценю любые входы на этом. Спасибо.

ответ

4

В строках один \ не интерпретируется как символ, ускоряющий выражение. Для того, чтобы избежать кронштейн внутри строковых литералов, вы должны использовать два обратных слеша, \\:

var reg = new RegExp("(.*\\[shots\\]\\[)([0-9]+)(\\].*\\])", "g"); 

Предпочтительным решением является использование RegEx литералов:

var reg = /(.*\[shots\]\[)([0-9]+)(\].*\])/g; 
0

Похоже, это работает:

var str = "holes[0][shots][0][units]"; 
var reg = /(.*\[shots\]\[)([0-9]+)(\].*\])/; 
console.log(str.replace(​reg,'$1'));​​​​​​​​​​​​​​​​​​​​​​​​