Я работаю над личным проектом, часть которого связана с экспериментальной вставкой точек с запятой. Хотя эту функцию можно применить к любому персонажу, я буду использовать обратные тики в качестве ориентира. См. Строку ниже.

var str = `HERE IS A
MULTILINE
COMMENT` 

Цель состоит в том, чтобы поставить точку с запятой после второго обратного галочки. Почему? Потому что, если мы добавляем точку с запятой после каждого обратного тика, наша строка будет выглядеть так:

`;HERE IS A
MULTILINE
COMMENT`;

Это изменит содержимое строки, что в конечном итоге изменит значение, добавив точку с запятой к значению строки. «Вот моя строка» - не то же самое, что «; Вот моя строка».

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

Используя регулярное выражение, мы можем идентифицировать обратные тики, написав /`/g. Эта небольшая линия будет соответствовать каждому экземпляру обратного тика в нашей строке. Попробуйте выполнить приведенный ниже код в своей консоли.

var str = "`HERE IS A COMMENT (with back ticks)`"
var newStr = str.replace(/`/g, '`;')
console.log(newStr)
> "`;HERE IS A COMMENT (with back ticks)`;"

Мы используем функцию JavaScript replace() для замены и передачи нашего регулярного выражения в качестве первого аргумента и '`;' в качестве второго аргумента. Эти аргументы говорят нашей replace() функции, что она должна найти все экземпляры ` и затем заменить их обратным тиком и точкой с запятой.

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

Они рекомендовали использовать группу захвата, заключающую в скобки часть паттерна. Это позволяет выделить часть матча. Группы захвата также полезны при использовании замен, но мы скоро вернемся к этому.

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

let str = "abcabcabcabc"
let matchedArr = str.match(/(abc)+/g)
console.log(matchedArr)
> ["abcabcabcabc"]

Это регулярное выражение применяет модификатор + к «abc», поэтому оно будет соответствовать любому экземпляру «abc», за которым следует один или несколько экземпляров «abc». Без группы захвата он применил бы модификатор только к «c», сопоставляя «abc» с последующим еще одним экземпляром «c». Есть смысл?

Мы будем использовать группу захвата, чтобы заключить наше отрицательное символьное выражение. В нашем выражении с отрицательным символом у нас есть открывающая обратная галочка за пределами скобок. Затем у нас есть закрывающая обратная галочка в скобках после карата, а также * после этого.

(`[^`]*)

Это будет искать шаблон, который включает в себя один открывающий обратный тик, за которым следуют 0 или более экземпляров любого символа, кроме обратного тика. Мы почти закончили, но нам все еще нужен еще один символ, чтобы завершить наш узор: закрывающий обратный тик! Почему? Мы хотим отделить все, что находится после первого обратного тика, от второго.

(`[^`]*)`

Это подводит нас к последней части нашей функции замены, подстановке.

Эта замена обозначается знаком доллара и числом. Поскольку у нас есть только одна группа захвата, мы будем использовать номер один. Цель нашей подстановки - сопоставить тот же текст, что и самый последний найденный нашей группой захвата. Мы будем использовать это, чтобы захватить контент после первого обратного тика включительно, а затем восстановить его в исходной форме. Как это помогает нашему делу? Что ж, мы можем добавить к нашей замене другие вещи, например, я не знаю, может быть, обратная галочка И точка с запятой?

Добавляя `; после нашего $1, мы фактически заменяем все, что находится после и включая нашу первую обратную галочку, на себя, а затем заменяем вторую обратную галочку (вне группы захвата) на обратную галочку и точку с запятой. Попробуйте приведенный ниже код, чтобы увидеть его в действии.

let str = "`HERE IS A COMMENT (with back ticks)`"
let final = str.replace(/(`[^`]*)`/g,'$1`;')
console.log(final)
> "`HERE IS A COMMENT (with back ticks)`;"

Резюме

Мы изолируем все, что находится после первого обратного тика включительно, с помощью группы захвата. Группа захвата начинается с открывающего обратного тика, за которым следует инвертированный класс символов. Этот инвертированный класс символов находит любой символ, кроме обратного тика. После этого мы используем звездочку для захвата 0 или более экземпляров любого символа после первого обратного тика (кроме другого обратного тика). С внешней стороны группы захвата у нас есть закрывающая обратная галочка, поэтому она отделена от контента, соответствующего группе захвата. Подстановка позволит нашей функции замены заменить первый обратный тик и следующий контент самим собой. Поскольку закрывающий обратный тик в нашем паттерне находится за пределами группы захвата, этот закрывающий обратный тик заменяется не самим собой, а, скорее, дополнительным обратным тиком и точкой с запятой в конце нашей замены.

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

Обновите бесплатную подписку на Medium до платной, и всего за 5 долларов в месяц вы получите неограниченное количество рассказов без рекламы от тысяч авторов из самых разных публикаций. Это партнерская ссылка, и часть вашего членства помогает мне получать вознаграждение за контент, который я создаю. Спасибо!

использованная литература







Классы символов или наборы символов
С помощью« класса символов
, также называемого набором символов , вы можете указать механизму регулярных выражений соответствовать только одному из нескольких… www.regular-expressions.info »