Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 13.02.2021, 13:33
Аспирант
Отправить личное сообщение для VolodinAS Посмотреть профиль Найти все сообщения от VolodinAS
 
Регистрация: 24.11.2012
Сообщений: 44

Регулярное выражение для маски input
Разрабатываю веб-приложения для журнала приёма пациентов. Необходимо оптимизировать ввод диагноза по мкб-10

Суть диагноза по мкб - это одна английская буква, затем две цифры - это категория мкб. Часто есть подкатегории мкб - это буква, две цифры, затем точка и еще одна цифра (двух вроде как не бывает).

Мой вопрос - как можно регуляркой это всё отразить?

проблема в том, что чтобы не переводить язык на английский, нужно, чтобы нажав "В" в поле ввелось "D", то есть, мкб - всегда начинается с английской буквы в верхнем регистре...

Примеры:
D44.1
C15.3
C73
U07.1
C81

Как это всё можно воплотить?

Последний раз редактировалось VolodinAS, 13.02.2021 в 13:34. Причина: добавил примеры
Ответить с цитированием
  #2 (permalink)  
Старый 13.02.2021, 14:29
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,173

VolodinAS,
/[A-Z]\d{2}(\.\d)*/
Ответить с цитированием
  #3 (permalink)  
Старый 13.02.2021, 15:38
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,173

маска для input first character is English only
VolodinAS,
<!DOCTYPE html>
<html>
<head>
    <title>Untitled</title>
    <meta charset="utf-8">
</head>
<body>
<input type="text" name="mkb">
    <script>
let input = document.querySelector('[name="mkb"]')
input.addEventListener("keydown", function(event) {
    let { code, key } = event;
    let { length } = input.value;
    if (['Delete', 'Backspace'].includes(code)) return;

    event.preventDefault();
    if (!length) {
        if (/^Key[A-Z]$/.test(code)) {
            input.value += code.slice(-1);
        }
    }
    if ([1, 2, 4].includes(length)) {
        if (/^Digit\d$/.test(code)) {
            input.value += code.slice(-1);
        }
    }
    if (length == 3) {
        if (key === '.') {
            input.value += key;
        }
    }
});
    </script>
</body>
</html>
Ответить с цитированием
  #4 (permalink)  
Старый 13.02.2021, 16:46
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 1,110

рони,
Вот такая последовательность.
"a" "1" "2" Ставим курсор между "1" и "2" Backspace "3"
Получаем A23 вместо A32

Не самое оптимальное решение, но лишено этого недостатка
<style>
#mkb10:invalid {
	border:1px solid red;
}

</style>

<body>
<label>МКБ 10 <input id=mkb10 type=text pattern="[A-Z]\d\d(\.\d)?" required></label>
<script>
const mkb = document.getElementById('mkb10');

	const cyrcode = 'ФИСВУАПРШОЛДЬТЩЗЙКЫМЯГ';
	const latcode = 'ABCDEFGHIJKLMNOPQRSTVZU'
	let icode = '';
	let rcode = '';
	mkb.addEventListener('keydown', (e) => {
		rcode = '';
		icode = e.key;
		if (icode.length == 1) {
			const ind = cyrcode.indexOf(icode.toUpperCase())
			if (ind>=0) {
				rcode = latcode[ind];
			} else if ('a'<=icode && icode<='z') {
				rcode = icode.toUpperCase();
			}
			if (! (/[A-Z0-9\.]/.test(rcode || icode))) {
				e.preventDefault();
			}
			
		}
	})
	mkb.addEventListener('input', (e) => {
		if (rcode) {
			const is = mkb.value.indexOf(icode)
			mkb.value = mkb.value.replace(icode, rcode);
			mkb.setSelectionRange(is+1, is+1);
		}
	})

</script>

Последний раз редактировалось voraa, 13.02.2021 в 16:56.
Ответить с цитированием
  #5 (permalink)  
Старый 13.02.2021, 17:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,173

voraa,
Ответить с цитированием
  #6 (permalink)  
Старый 13.02.2021, 19:31
Аспирант
Отправить личное сообщение для VolodinAS Посмотреть профиль Найти все сообщения от VolodinAS
 
Регистрация: 24.11.2012
Сообщений: 44

Спасибо огромное! Шикарное решение!
Ответить с цитированием
  #7 (permalink)  
Старый 15.02.2021, 08:15
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 1,110

Сообщение от рони
input.addEventListener("keydown", function(event) {
    let { code, key } = event;
Это хорошо, когда эти поля есть.
Я вот столкнулся с приколом, когда событие keydown возникает, а в event просто нет этих полей.
Ни code, ни key, ни keyCode, ни всяких meta, shift...
Соответственно на key.length получаю
TypeError: Cannot read property 'length' of undefined

Бывает и такое.
Ответить с цитированием
  #8 (permalink)  
Старый 15.02.2021, 08:25
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 30,173

voraa,
бывает...
Ответить с цитированием
  #9 (permalink)  
Старый 15.02.2021, 08:30
Профессор
Отправить личное сообщение для voraa Посмотреть профиль Найти все сообщения от voraa
 
Регистрация: 03.02.2020
Сообщений: 1,110

Противно, что в документации нигде про такое не написано.
с одной ситуацией столкнулся, но может и другие есть.

Эта ситуевина возникает, когда выбираешь значение из списка автозаполнения.
Все мышью делается. Зачем там вообще keydown выскакивает?
Ведь если делать paste мышью из контекстного меню, никакого keydown не возникает. А тут примерно тоже самое - клавиатуру вообще не трогаю.

Последний раз редактировалось voraa, 15.02.2021 в 08:35.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Регулярное выражение Medvedoc Firefox/Mozilla 2 08.11.2017 16:42
Регулярное выражение для sed Bravo Серверные языки и технологии 4 24.10.2016 13:46
Регулярное выражение для валидации номеров Украины Alex_ya Общие вопросы Javascript 1 13.05.2014 14:19
Регулярное выражение для проверки URL Beck Events/DOM/Window 13 06.02.2011 07:01
Регулярное выражение для поиска смайлов. NightmareZ Общие вопросы Javascript 13 23.06.2009 12:12