Учитывая следующий ввод:
123456781234567812345678
Я пытаюсь выполнить следующее:
12345678,12345678,12345678
В настоящее время работа по выполнению этого в настоящее время читается как:
parts = parts.replace(/\B(?=(\d{8})+(?!\d))/g, ",");
Проблема, которую я получаю, заключается в том, что регулярное выражение читается справа налево. Я создал JSFIDDLE, чтобы показать проблему. В результате я получаю что-то вроде этого.
123,45678910,12345678
Наконец, когда я использую клавиши со стрелками для перемещения, он возвращает меня обратно в конец ввода.
Используя @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.
Затем вам нужно использовать фрагмент кода, чтобы поместить карету, где она была при замене значения.
Вы можете использовать нижележащее регулярное выражение, основанное на нижнем выражении.
alert('123456781234567812345678122'.replace(/(\d{8})(?!$)/g, "$1,"))
alert('123456781234567812345678'.replace(/(\d{8})(?!$)/g, "$1,"))
(\d{8})
захватывает каждые 8 цифр, но не тот, который был последним. (?!$)
отрицательный lookahead, который утверждает, что совпадение не будет сопровождаться концом привязки линии. Таким образом, заменяя согласованные символы присутствием внутри первой группы плюс ,
, вы получите желаемый результат.
12345678,91012345,678
?