Регулярное выражение JavaScript с захватом скобок

1

У меня есть этот пункт:

<p>FIRST SECOND THIRD</p>

и я хочу обернуть второе слово в SPAN так:

<p>FIRST <span>SECOND</span> THIRD</p>

Если я это сделаю:

text.replace(/\s(\w+)\s/, '<span>$1</span>');

символы пробела до и после исчезновения слова. Зачем? Что я делаю не так? Я думал, что /\s(\w+)\s/ захватывает слово, но не пробелы.

Смотрите здесь: http://jsfiddle.net/simevidas/TpTzV/

Теги:

3 ответа

3
Лучший ответ

Пробелы пропущены, потому что они являются частью всего матча. Захват - это то, что он помнит, чтобы заменить обратно на заменяющую строку через обратные ссылки.

Если JavaScript поддерживает оба запроса lookahead и lookbehind, вы можете сделать это:

text.replace(/(?<\s)(\w+)(?=\s)/, '<span>$1</span>');

Но это не так, поэтому вы можете попробовать захватить пробелы (отдельно от слова, которое вы обертываете), и вместо этого вернуть обратно:

text.replace(/(\s)(\w+)(\s)/, '$1<span>$2</span>$3');
  • 0
    @Bolt Итак, $1 представляет все совпадение, а не первые захватывающие скобки?
  • 0
    $1 представляет первый захват. Весь матч обозначается символом $& .
Показать ещё 4 комментария
1

$1 будет частью, захваченной бит, который вы заключили в круглые скобки, который является \w +, который будет состоять из слов, а не пробелов. Если вы хотите также захватить пробелы, сделайте следующее:

/(\s\w+\s)/
  • 0
    Это привело бы к <span> SECOND </span> с пробелами внутри тегов.
  • 1
    Это то, что я думал, ты хотел по любой причине. Если вам нужны пробелы вне тегов <span>, то вам нужно либо три разных захвата (по одному для каждого пробела и один для слова, что, по-видимому, является ответом, который вы приняли), или вам нужно вставить пробелы в заменить следующим образом: text.replace (/ \ s (\ w +) \ s /, '<span> $ 1 </ span>'); Обратите внимание, что последний заменит любой символ пробела с обеих сторон слова пробелом. Но если это не имеет значения для вас, тогда это будет сделано.
Показать ещё 2 комментария
1

Пробелы исчезают, потому что не сгруппированы.

Попробуйте:

replace(/(\s\w+\s)/

Пространства (\s) внутри группировки.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню