Регулярное выражение - 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'
.