Регулярное выражение - 4 цифры подряд, но не все нули

Я ищу решение, которое может быть выполнено исключительно с помощью регулярного выражения. Я знаю, что это будет легко с переменными, подстроками и т.д.

И я ищу синтаксис regex стиля PCRE, хотя я упоминаю vim.

Мне нужно определить строки с 4 числовыми цифрами, и они не могут быть все 0. Таким образом, следующие строки будут соответствовать:

0001 
1000 
1234 
0101

И это не будет:

0000

Это подстрока, которая будет возникать в заданном месте в большой строке, если это имеет значение; Я не думаю, что это нужно. Например

xxxxxxxxxxxx0001xxxxx
xxxxxxxxxxxx1000xxxxx
xxxxxxxxxxxx1234xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0101xxxxx
xxxxxxxxxxxx0000xxxxx

Ответ 1

 (?<!\d)(?!0000)\d{4}(?!\d)

или, более любезно/поддерживающе/безопасно:

m{
     (?<! \d   )    # current point cannot follow a digit
     (?!  0000 )    # current point must not precede "0000"
     \d{4}          # match four digits at this point, provided...
     (?!  \d   )    # that they are not then followed by another digit
}x

Ответ 2

Поскольку я жаловался, что некоторые из ответов здесь не были регулярными выражениями, я думал, что лучше всего дать вам регулярный ответ. Это примитивно, возможно, лучший способ, но он работает:

([1-9][0-9][0-9][0-9]|[0-9][1-9][0-9][0-9]|[0-9][0-9][1-9][0-9]|[0-9][0-9][0-9][1-9])

Это проверяет что-то, содержащее 0-9 в каждом месте, кроме одного, которое должно лежать в 1-9, предотвращая сопоставление 0000. Вероятно, вы можете записать это проще, используя \d вместо [0-9], если ваш парсер regex поддерживает этот метасимвол.

Ответ 3

Так как PCRE поддерживает образы, \d{4}(?<!0000) найдет любой экземпляр из четырех последовательных ненулевых символов. См. Его в действии здесь.

Если вы должны убедиться, что совпадение встречается только в правильной позиции строки, вы можете вместо этого использовать ^.{X}\d{4}(?<!0000).{Y}$, где X и Y - количество предшествующих и следующих символов соответственно (12 и 5 в вашем примере.)

Ответ 4

Простое соответствие для 4 цифр (\d{4} должно это сделать), а затем убедитесь, что ваше совпадение не равно '0000'.