Отрицание в /,?(([1-9]-[1-9])|([1-9]))/ g

#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" как первое совпадение.