Ну, вам нужно получить регулярное выражение, которое идентифицирует полные группы из трех цифр перед десятичной точкой, чтобы вы могли скопировать их с добавленным символом запятой. Но проблема в том, что вы можете контролировать только совпадение с регулярным выражением, а не шаблон замещения (который варьируется в случае, если ваш шаблон соответствует нескольким группам или нет)
Первая попытка состоит в том, чтобы попытаться сопоставить \d?\d?(\d\d\d)*(\.\d*\|\b)
(одна или две цифры, за которыми следуют ноль или более групп из трех цифр - это то, что нас интересует), а затем либо десятичная точка с большим количеством цифр ( нас это не интересует, так как мы не собираемся заменять какой-либо из них) или границу слова (чтобы запретить сопоставление последовательностей с несколькими точками, например (например, 012345.2342.1233)
Проблема в том, что у нас есть только одна группа интересов здесь (центральная (\d\d\d)
), но это означает, что мы должны построить шаблон замещения со всеми остальными и поместить группу куда-нибудь (таким образом, наша регулярное выражение изменяется на (\d?\d?)(\d\d\d)*(\.\d\|\b)
, поэтому мы можем использовать \1,\2\3
в качестве замены). Это неверно, потому что мы будем ставить только запятую перед последней группой, совпадающей с \2
, и мы должны сделать замену для каждой подходящей группы.
Следующий подход заключается в явном использовании нескольких групп в регулярном выражении, например (\d?\d?)(\d\d\d)?(\d\d\d)?...(\d\d\d)?(\.\d*\|\b)
, поэтому мы можем заменить каждую группу (\2
, \3
... на ,\2
, ,\3
...) но это также не работает, так как вы всегда ставите запятые на свои места, независимо от соответствия внутренних групп (что дает вам что-то вроде 1,,,,000,000,000.234566
. Конечно, вы можете сделать двухэтапный подход, сделав два замены: последняя и та, которая заменяет ,,+
на ,
(несколько последовательностей запятых в одну запятую)
Единственный подход заключается в том, чтобы фактически сопоставить \d\d\d
и заменить совпадение на ,\0
. Но на этот раз мы снова столкнемся с проблемами, поскольку у нас должна быть вся цепочка цифр, поскольку группы начинаются в конце, и это контекстная информация, которую мы должны выделить из нашего регулярного выражения.
Единственное решение, которое работает, состоит в том, чтобы идентифицировать строку, которая соответствует интересующей последовательности цифр (строки цифр, которым не предшествует точка и которые содержат более трех цифр, например, (^\|[^.\n])(\d\d\d\d*)
, и затем выполнить всю подстановку над ними. что вам нужно начать справа и идти налево, вы должны сделать это один раз (ищите последнюю группу из трех цифр \d\d\d$
и измените ее на ,\0
)
Как было предложено в одном из ответов на вопрос, на который вы ссылаетесь в своем, лучший способ - использовать альтернативный метод, такой как this (используя toLocaleString()
метод javascript)