Регулярное выражение (регулярные выражения), заменить второй случай в JavaScript - PullRequest
5 голосов
/ 09 января 2011

Это пример строки, с которой вы работаете:

xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]

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

\[+[0-9]+\]

Это возвращает [7], однако я хочу вернуть [9].

Я использую Javascriptфункция замены, следующее регулярное выражение соответствует второму вхождению ([9]) в приложениях тестирования регулярных выражений, однако оно не заменяется корректно в функции замены Javascript:

(?:.*?(\[+[0-9]+\])){2}

Мой вопрос: как мне использоватьприведенное выше регулярное выражение для замены [9] в Javasctipt или есть другое регулярное выражение, которое соответствует второму вхождению числа в квадратных скобках.

Cheers!

Ответы [ 3 ]

3 голосов
/ 09 января 2011

Если xxx - это просто любая строка, а не обязательно число, то это может быть тем, что вы хотите:

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

Это ищет второе число в [].Замените его на $1[<replacement>]. Поиграйте с ним на Rubular .

Ваше регулярное выражение не работает должным образом, поскольку группы, за которыми следует +, в конечном итоге удерживают last [xxx].

1 голос
/ 09 января 2011

Попробуйте

result = subject.replace(/(\[\d\]\[[^\]]+\])\[\d\]/, "$1[replace]");

В качестве прокомментированного регулярного выражения:

(       # capture the following in backref 1:
\[\d\]  # first occurrence of [digit]
\[      # [
 [^\]]+ # any sequence of characters except ]
\]      # ]
)       # end of capturing group
\[\d\]  # match the second occurence of [digit]

Если число [xxx] групп между первой и второй [digit] группами является переменным, тогда используйте

result = subject.replace(/(\[\d\](?:\[[^\]]+\])*?)\[\d\]/, "$1[replace]");

Окружая часть, которая соответствует [xxx] группам, с (не фиксирующими) круглыми скобками и ленивым квантификатором *? Я прошу механизм регулярных выражений сопоставить как можно меньше таких групп, но столько, сколько необходимо поэтому следующая группа - это [digit] группа.

0 голосов
/ 09 января 2011
console.log( "xxxxxx[xxxxxx][7][xxxxxx][9][xxxxxx]".replace(
/^(.*\[[0-9]+\].*)(\[[0-9]+\])(.*)$/, 
'$1[15]$3')); // replace with matches before ($1) and after ($3) your match ($2)

возвращает:

// xxxxxx[xxxxxx][7][xxxxxx][15][xxxxxx]

Будет соответствовать, когда [n] предшествует 1 набор скобок с числами внутри.

...