Как "/\ B (? = (?:\D {3}) + (?!\D))/g" работают для добавления запятой на числа?

function putComma(price) {
    return price.toString().replace(/\B(?=(?:\d{3})+(?!\d))/g, ",");
}

Это рабочий фрагмент для запятой на номера не менее 4 цифр.

Но как это → /\B(?=(?:\d{3})+(?!\d))/g сказать, что число составляет не менее 4 цифр?

Ответ 1

Как и комментарии, чтение о регулярных выражениях будет наиболее выгодным для вас (в конечном итоге). Нарушение этого конкретного регулярного выражения таково:

  • \B говорит, что он смотрит только в пределах границы слова (это означает, что он не может быть частью другого типа слова - он не может быть b123412b123, а только принимать то, что он находит, если он стоит один - 123456, a 123456 w
  • Затем lookahead (?= сообщает ему, чтобы найти все, что находится в группе (пока оно не достигнет соответствующей закрывающей скобки) и только вернется, если оно будет найдено в целом, но также убедитесь, что замена выполняется в обратном порядке, потому что он смотрит далеко вперед по отношению к концу строки.
  • ?: указывает, что он ищет следующее совпадение, но не создает обратную ссылку (термин в регулярных выражениях)
  • \d{3} ищет 3 цифры подряд.
  • Затем + после этого отмечает, что 3 цифры (завернутые в круглые скобки, чтобы убедиться, что правило рассматривается как один блок, например, - (\d{3})+) шаблон может повторить (3 цифры, 6, 9 и т.д.).
  • Последний (?!\d) ищет еще одну цифру, но исключая ее, убедившись, что цифры находятся в группах по 3 и не сопровождаются цифрами, которые не входят в группы из 3.

Таким образом, в основном он ищет 1 или более групп из 3 цифр, сообщая RegEx не, чтобы вернуть соответствующие цифры (потому что они игнорируются с помощью ?:), поэтому возвращает только часть сопоставьте это не ничего - он возвращает \B, и то, что заменяется. Так эффективно он заменяет только полные группы из 3, начиная с конца строки, заставляя его превращать 3333333 в 3,333,333.