Подтвердить что ты не робот

Почему диапазон [01-12] работает так, как ожидалось?

Я пытаюсь использовать шаблон диапазона [01-12] в регулярном выражении для соответствия двухзначным цифрам мм, но это не работает должным образом.

4b9b3361

Ответ 1

Похоже, вы неправильно поняли, как работает определение классов символов в регулярных выражениях.

Чтобы соответствовать любой из строк 01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11 или 12, работает примерно так:

0[1-9]|1[0-2]

Рекомендации


объяснение

Класс символов сам по себе пытается сопоставить один и ровно один символ из входной строки. [01-12] фактически определяет [012], класс символов, который соответствует одному символу из ввода против любого из 3 символов 0, 1 или 2.

- определение диапазона идет от 1 до 1, который включает в себя только 1. С другой стороны, что-то вроде [1-9] включает в себя 1, 2, 3, 4, 5, 6, 7, 8, 9.

Начинающие часто делают ошибки, определяя такие вещи, как [this|that]. Это не "работает". Это определение символа определяет [this|a], т.е. оно сопоставляет один символ из входных данных с любым из 6 символов в t, h, i, s, | или. a Более чем вероятно (this|that) то, что предназначено.

Рекомендации


Как определяются диапазоны

Так что теперь очевидно, что схема, например, between [24-48] hours, не "работает". Класс символов в этом случае эквивалентен [248].

То есть - в определении класса символов не определяет числовой диапазон в шаблоне. Движки Regex на самом деле не "понимают" числа в шаблоне, за исключением синтаксиса с конечным повторением (например, a{3,5} соответствует от 3 до 5 a).

Вместо этого определение диапазона использует ASCII/Unicode-кодировку символов для определения диапазонов. Символ 0 кодируется в ASCII как десятичное число 48; 9 равно 57. Таким образом, определение символа [0-9] включает в себя все символы, значения которых находятся между десятичными 48 и 57 в кодировке. Весьма разумно, что по замыслу это символы 0, 1 ,..., 9.

Смотрите также


Другой пример: от А до Я

Давайте посмотрим на другое определение класса общих символов [a-zA-Z]

В ASCII:

  • A= 65, Z= 90
  • a= 97, z= 122

Это означает, что:

  • [a-zA-Z] и [A-Za-z] эквивалентны
  • В большинстве ароматов [aZ] может быть недопустимым диапазоном символов
    • потому a (97) "больше, чем", чем Z (90)
  • [Az] является законным, но также включает в себя следующие шесть символов:
    • [ (91), \ (92), ] (93), ^ (94), _ (95), ' (96)

Смежные вопросы

Ответ 2

Символьный класс в регулярных выражениях, обозначаемый синтаксисом [...], определяет правила, соответствующие одному символу на входе. Таким образом, все, что вы пишете между скобками, указывает, как соответствовать одному символу.

Таким образом, ваш шаблон [01-12] разбит следующим образом:

  • 0 - совпадение с одной цифрой 0
  • или, 1-1, соответствуют одной цифре в диапазоне от 1 до 1
  • или, 2, соответствуют одной цифре 2

Итак, в основном все, что вам нужно, это 0, 1 или 2.

Чтобы выполнить нужное вам совпадение, сопоставляя две цифры, начиная с 01-12 как цифры, вам нужно подумать о том, как они будут выглядеть как текст.

У вас есть:

  • 01-09 (т.е. первая цифра равна 0, вторая цифра - 1-9)
  • 10-12 (т.е. первая цифра равна 1, вторая цифра равна 0-2)

Затем вам нужно будет написать для него регулярное выражение, которое может выглядеть так:

  +-- a 0 followed by 1-9
  |
  |      +-- a 1 followed by 0-2
  |      |
<-+--> <-+-->
0[1-9]|1[0-2]
      ^
      |
      +-- vertical bar, this roughly means "OR" in this context

Обратите внимание, что попытка объединить их для получения более короткого выражения не удастся, предоставив ложные положительные совпадения для недопустимого ввода.

Например, шаблон [0-1][0-9] будет в основном соответствовать номерам 00-19, что немного больше, чем вы хотите.

Я попытался найти определенный источник для получения дополнительной информации о классах символов, но пока все, что я могу вам дать, это Google Query for Regex Character Classes. Надеюсь, вы сможете найти там больше информации, чтобы помочь вам.

Ответ 3

Это также работает:

^([1-9]|[0-1][0-2])$

[1-9] соответствует одиночным цифрам от 1 до 9

[0-1][0-2] соответствует двум цифрам от 10 до 12

Есть несколько хороших примеров здесь

Ответ 4

Как заявляют полигенные смазочные материалы, ваш поиск будет выглядеть скорее как 0 | 1-1 | 2, а не тем, что вы хотите, из-за того, что классы символов (вещи в []) соответствуют символам, а не строкам.

Ответ 5

[] в регулярном выражении обозначает класс символов. Если диапазоны не заданы, они неявно или каждый символ внутри него вместе. Таким образом, [abcde] совпадает с (a|b|c|d|e), за исключением того, что он ничего не фиксирует; он будет соответствовать любому из a, b, c, d или e. Весь диапазон указывает набор символов; [ac-eg] говорит, что "соответствует любому из: a, любому символу между c и e; или g". Таким образом, ваше совпадение говорит: "соответствовать любому из: 0, любому символу между 1 и 1 (т.е. Просто 1)) или 2.

Ваша цель, очевидно, указать диапазон чисел: любое число между 01 и 12, написанное двумя цифрами. В этом конкретном случае вы можете сопоставить его с 0[1-9]|1[0-2]: либо a 0, за которым следует любая цифра между 1 и 9, либо 1, за которой следует любая цифра между 0 и 2. В общем случае вы можете преобразовать любой диапазон чисел в действительное регулярное выражение аналогичным образом. Однако может быть лучший вариант, чем обычные выражения, или существующая функция или модуль, которые могут создать регулярное выражение для вас. Это зависит от вашего языка.

Ответ 6

Использовать этот:

0?[1-9]|1[012]
  • 07: действителен
  • 7: действительный
  • 0: не совпадает
  • 00: не совпадает
  • 13: не совпадает
  • 21: не совпадает

Чтобы проверить шаблон как 07/2018, используйте это:

/^(0?[1-9]|1[012])\/([2-9][0-9]{3})$/

(Диапазон дат от 01/2000 до 12/9999)

Ответ 7

Это IP range regular expression builder
Он бесплатен и автоматически сгенерирует регулярное выражение, необходимое для диапазона IP-адресов.

https://www.analyticsmarket.com/freetools/ipregex/

Ответ 8

Чтобы решить эту проблему, вы можете использовать /^[0-1][0-9]$/; И если вы хотите только 01 до 12, вам нужно проверить два условия:

Значение 00 с помощью инструкции if:

if(thevale=="00")
{
    // message to user...not allowed
}

и

if(thevalue >=13)
{
    // message to user...not allowed
}

Пример кода в Javascript:

function CheckMonth(txtBox) {        
        var ex = /^[0-1][0-9]$/;
        if (txtBox.value.trim() != "") {
            if (txtBox.value.trim() == "00") {
                alert('Please enter valid numbers.');
                txtBox.value = "";
                txtBox.focus();
            }
            else if (ex.test(txtBox.value.trim()) == false) {
                alert('Please enter valid numbers.');
                txtBox.value = "";
                txtBox.focus();
            }
            else if (parseInt(txtBox.value.trim()) >= 13) {
                alert('Please enter valid numbers.');
                txtBox.value = "";
                txtBox.focus();
            }
        }
    }