Добавьте запятую через каждые восемь цифр

8

Учитывая следующий ввод:

123456781234567812345678

Я пытаюсь выполнить следующее:

12345678,12345678,12345678

В настоящее время работа по выполнению этого в настоящее время читается как:

parts = parts.replace(/\B(?=(\d{8})+(?!\d))/g, ",");

Проблема, которую я получаю, заключается в том, что регулярное выражение читается справа налево. Я создал JSFIDDLE, чтобы показать проблему. В результате я получаю что-то вроде этого.

123,45678910,12345678

Наконец, когда я использую клавиши со стрелками для перемещения, он возвращает меня обратно в конец ввода.

REGEX101

  • 1
    Каков ваш вклад и ожидаемый результат?
  • 1
    Немного неясно, что вы на самом деле хотите, чтобы произошло. Хотите, чтобы он выглядел как 12345678,91012345,678 ?
Показать ещё 1 комментарий
Теги:

2 ответа

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

Используя @Avinash regexp вместе с моим ответом из этого вопроса, вы можете добиться того, чего хотите с помощью этот код:

    $('.singleSpace').keyup(function() {
        var foo = this.value.replace(/\D/g, '').replace(/(\d{8})(?!$)/g, "$1,")
        
        var carretPos = doGetCaretPosition(this)
        
        carretPos += foo.length - this.value.length
        
        this.value = foo;
        
        setSelectionRange(this, carretPos, carretPos)
    });
    
    
    //Code taken from
    // https://stackoverflow.com/questions/17858174/set-cursor-to-specific-position-on-specific-line-in-a-textarea
    function setSelectionRange(input, selectionStart, selectionEnd) {
        if (input.setSelectionRange) {
            input.focus();
            input.setSelectionRange(selectionStart, selectionEnd);
        }
        else if (input.createTextRange) {
            var range = input.createTextRange();
            range.collapse(true);
            range.moveEnd('character', selectionEnd);
            range.moveStart('character', selectionStart);
            range.select();
        }
    }
    
    //Code taken from
    // https://stackoverflow.com/questions/2897155/get-cursor-position-in-characters-within-a-text-input-field
    function doGetCaretPosition (oField) {
        
        // Initialize
        var iCaretPos = 0;
        
        // IE Support
        if (document.selection) {
            
            // Set focus on the element
            oField.focus ();
            
            // To get cursor position, get empty selection range
            var oSel = document.selection.createRange ();
            
            // Move selection start to 0 position
            oSel.moveStart ('character', -oField.value.length);
            
            // The caret position is selection length
            iCaretPos = oSel.text.length;
        }
        
        // Firefox support
        else if (oField.selectionStart || oField.selectionStart == '0')
            iCaretPos = oField.selectionStart;
        
        // Return results
        return (iCaretPos);
    }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

<input type="text" class="singleSpace" />

В основном, используйте regexp для внесения изменений. Обязательно удалите каждый символ без цифры перед запуском дополнительных запятых regexp.

Затем вам нужно использовать фрагмент кода, чтобы поместить карету, где она была при замене значения.

8

Вы можете использовать нижележащее регулярное выражение, основанное на нижнем выражении.

alert('123456781234567812345678122'.replace(/(\d{8})(?!$)/g, "$1,"))
alert('123456781234567812345678'.replace(/(\d{8})(?!$)/g, "$1,"))

DEMO

(\d{8}) захватывает каждые 8 ​​цифр, но не тот, который был последним. (?!$) отрицательный lookahead, который утверждает, что совпадение не будет сопровождаться концом привязки линии. Таким образом, заменяя согласованные символы присутствием внутри первой группы плюс ,, вы получите желаемый результат.

Ещё вопросы

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