#javascript #regex
#javascript #регулярное выражение
Вопрос:
Я пытаюсь сопоставить строку, содержащую сочетание цифр и цифр через дефис, например, спецификацию ответа на кроссворд, например 1,2-2
, или 1-1,3,4,2-2
/,?(([1-9]-[1-9])|([1-9]))/g
это то, что я придумал, чтобы соответствовать строке
value = value.replace(/,?(([1-9]-[1-9])|([1-9]))/g, '');
заменяет ok, и я проверил это в онлайн-тестере.
Что мне действительно нужно, так это отрицать это, чтобы я мог использовать его в событии ввода, проверять содержимое текстовой области и удалять символы, которые не подходят, поэтому он допускает только сквозные символы, как в примере.
Я пробовал ^
там, где ожидалось, но это не то, что я ожидаю, как мне отменить регулярное выражение, чтобы удалить все, что не соответствует?
Если есть лучший способ сделать это, я тоже открыт для предложений.
Комментарии:
1. Это довольно глупо. Что происходит, когда пользователь пишет
1-
? Когда происходит ввод ключа-
, он отменяется, потому1-
что неверен. Это делается после того, как пользователь заканчивает писать текстовое поле и меняет фокус на другой элемент. ИЛИ вы позволяете пользователю только вставлять[1-9,-]
(а затем, после изменения фокуса, вы проверяете текст)
Ответ №1:
var value = 'hello,1,2,3,4-6,1-1,3,test,4,2-2';
var pattern = /,?(([1-9]-[1-9])|([1-9]))/g;
value.replace(pattern, ''); // "hello,test"
Вы можете использовать строку#match . С /g
помощью flag он возвращает массив всех совпадений, затем вы можете использовать Array#join для их объединения.
Проблема в том, что строка #match возвращает null, когда совпадения нет, поэтому вам нужно обработать этот случай и использовать пустой массив, чтобы он мог присоединиться:
(value.match(pattern) || []).join(''); // ",1,2,3,4-6,1-1,3,4,2-2"
Примечание: возможно, лучше проверить их onblur
, а не onkeyup
. Возня с текстом, который пользователь вводит в данный момент, сделает его раздражающим. Лучше подождать, пока пользователь закончит печатать.
Комментарии:
1. очень полезный ответ, я также принял к сведению ваше предложение об onblur. Массив совпадений — это именно то, что мне нужно для следующей части кодирования.
Ответ №2:
Не тестировал его в JS, но это должно возвращать допустимую строку, начинающуюся слева, и до тех пор, пока встречаются допустимые значения (обратите внимание, что я использовал d
— если вам нужно только 1-9, тогда используйте свои скобки).
(?:d(?:-d)?,)*d(?:-d)?
Например, сопоставление этого регулярного выражения со строкой "0-1,1,2,3,4-4,2,,1,3--4"
будет возвращено "0-1,1,2,3,4-4,2"
как первое совпадение.