Я работаю над личным проектом, часть которого связана с экспериментальной вставкой точек с запятой. Хотя эту функцию можно применить к любому персонажу, я буду использовать обратные тики в качестве ориентира. См. Строку ниже.
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 долларов в месяц вы получите неограниченное количество рассказов без рекламы от тысяч авторов из самых разных публикаций. Это партнерская ссылка, и часть вашего членства помогает мне получать вознаграждение за контент, который я создаю. Спасибо!
использованная литература
Группы захвата
Часть шаблона можно заключить в круглые скобки (...). Это называется «группой захвата. Это имеет два эффекта: Это… javascript.info »
Классы символов или наборы символов
С помощью« класса символов , также называемого набором символов , вы можете указать механизму регулярных выражений соответствовать только одному из нескольких… www.regular-expressions.info »