Мой австралийский номер Medicare состоит из 11 цифр и не содержит букв или других символов.
Форматируется по группам, и последняя цифра зависит от члена моей семьи, например ::100100
- Я:
5101 20591 8-1
- Моя жена:
5101 20591 8-2
- Мой первый ребенок:
5101 20591 8-3
Я видел номера медицинской помощи, отформатированные без пробелов и тире, но значение то же самое, поэтому я ожидал бы принять 51012059181
в качестве действительного номера медицинской помощи.
Я также видел контекст, в котором последняя цифра не требуется или не должна вводиться; например 5101205918
, я думаю, где их интересует только семья в целом.
Поэтому я думаю, что это может быть уместно:
^\d{4}[ ]?\d{5}[ ]?\d{1}[- ]?\d?$
EDIT
Основываясь на логике в ответе user2247167, я использовал следующую функцию PL / SQL в своем приложении Apex, чтобы дать пользователю удобное предупреждение:
FUNCTION validate_medicare_no (i_medicare_no IN VARCHAR2)
RETURN VARCHAR2 IS
v_digit1 CHAR(1);
v_digit2 CHAR(1);
v_digit3 CHAR(1);
v_digit4 CHAR(1);
v_digit5 CHAR(1);
v_digit6 CHAR(1);
v_digit7 CHAR(1);
v_digit8 CHAR(1);
v_check CHAR(1);
v_result NUMBER;
BEGIN
IF NOT REGEXP_LIKE(i_medicare_no, '^\d{10}\d?{2}$') THEN
RETURN 'Must be 10-12 digits, no spaces or other characters';
ELSE
v_digit1 := SUBSTR(i_medicare_no, 1, 1);
IF v_digit1 NOT IN ('2','3','4','5','6') THEN
RETURN 'Not a valid Medicare number - please check and re-enter';
ELSE
v_digit2 := SUBSTR(i_medicare_no, 2, 1);
v_digit3 := SUBSTR(i_medicare_no, 3, 1);
v_digit4 := SUBSTR(i_medicare_no, 4, 1);
v_digit5 := SUBSTR(i_medicare_no, 5, 1);
v_digit6 := SUBSTR(i_medicare_no, 6, 1);
v_digit7 := SUBSTR(i_medicare_no, 7, 1);
v_digit8 := SUBSTR(i_medicare_no, 8, 1);
v_check := SUBSTR(i_medicare_no, 9, 1);
v_result := mod( to_number(v_digit1)
+ (to_number(v_digit2) * 3)
+ (to_number(v_digit3) * 7)
+ (to_number(v_digit4) * 9)
+ to_number(v_digit5)
+ (to_number(v_digit6) * 3)
+ (to_number(v_digit7) * 7)
+ (to_number(v_digit8) * 9)
,10);
IF TO_NUMBER(v_check) != v_result THEN
RETURN 'Not a valid Medicare number - please check and re-enter';
END IF;
END IF;
END IF;
-- no error
RETURN NULL;
END validate_medicare_no;