Dado um valor, quero validá-lo para verificar se é um ano válido. Meus critérios são simples, onde o valor deve ser um número inteiro com 4
caracteres. Sei que essa não é a melhor solução, pois não permitirá anos antes 1000
e permitirá anos como 5000
. Este critério é adequado para meu cenário atual.
O que eu inventei é
\d{4}$
Embora funcione, também permite valores negativos.
Como posso garantir que apenas números inteiros positivos sejam permitidos?
regex
string
validation
string-matching
Ranhiru Jude Cooray
fonte
fonte
Respostas:
Você precisa adicionar uma âncora inicial
^
como:^\d{4}$
Seu regex
\d{4}$
corresponderá a strings que terminam com 4 dígitos . Portanto, entradas como-1234
serão aceitas.Ao adicionar a âncora de início, você associa apenas as strings que começam e terminam com 4 dígitos, o que efetivamente significa que devem conter apenas 4 dígitos.
fonte
whateverblahblah2323
. Agora eu entendo porque um pouco de aprendizado é perigoso: O10000
seria um bug.Anos de 1000 a 2999
^[12][0-9]{3}$
Para 1900-2099
fonte
^(?:19|20)\d{2}$
(19|20)\d{2}
ao meu regex para validar um formato de data de nascimento? Esta é a minha regex/^[0-9]{1,2}\/(0[1-9])|(1[0-2])\/[0-9]{4}$/
. Quero garantir que o ano sempre tenha 4 dígitos e comece a murchar 19 ** ou 20 **A resposta "aceita" a esta pergunta é incorreta e míope.
É incorreto porque corresponderá a strings como
0001
, que não é um ano válido.É míope porque não corresponderá a nenhum valor acima de 9999. Já esquecemos as lições do Y2K ? Em vez disso, use a expressão regular:
^[1-9]\d{3,}$
Se você precisar corresponder anos no passado, além de anos no futuro, poderá usar esta expressão regular para corresponder a qualquer número inteiro positivo:
^[1-9]\d*$
Mesmo que você não espere datas do passado, você pode querer usar esta expressão regular de qualquer maneira, apenas no caso de alguém inventar uma máquina do tempo e quiser levar seu software de volta com eles.
Nota: Esta expressão regular corresponderá a todos os anos, incluindo aqueles anteriores ao ano 1, uma vez que eles são normalmente representados com uma designação BC em vez de um número inteiro negativo. Claro, essa convenção pode mudar nos próximos milênios, então sua melhor opção é combinar qualquer número inteiro - positivo ou negativo - com a seguinte expressão regular:
^-?[1-9]\d*$
fonte
Isso funciona de 1900 a 2099:
/(?:(?:19|20)[0-9]{2})/
fonte
Com base na resposta @ r92, para os anos 1970-2019:
(19[789]\d|20[01]\d)
fonte
197999
19[789]\d\d\d
permitiria197999
/(19[789]\d|20[01]\d)/.test(1970324) >> true
1970
), não aos 3 últimos(19[789]\d|20[01]\d)[^0-9]
. Isso combinaria,1970 324
mas não1970324
Para testar um ano em uma string que contém outras palavras junto com o ano, você pode usar o seguinte regex: \ b \ d {4} \ b
fonte
Em teoria, a opção de 4 dígitos está certa. Mas, na prática, pode ser melhor ter uma faixa de 1900-2099.
Além disso, ele precisa ser um grupo sem captura. Muitos comentários e respostas propõem capturar o agrupamento que não é IMHO adequado. Porque para correspondência pode funcionar, mas para extrair correspondências usando regex, ele extrairá números de 4 dígitos e números de dois dígitos (19 e 20) também por causa do parêntese.
Isso funcionará para correspondência exata usando grupos de não captura:
(?:19|20)\d{2}
fonte
você pode ir com sth como [
^-]\d{4}$
: você evita que o sinal de menos-
fique antes de seus 4 dígitos.você também pode usar
^\d{4}$
com^
para pegar o início da string. Na verdade, depende do seu cenário ...fonte
Usar;
para os anos 1900 - 9999.
Não precisa se preocupar com 9999 e em diante - a AI estará fazendo toda a programação até então !!! Hehehehe
Você pode testar seu regex em https://regex101.com/
Também mais informações sobre grupos de não captura (mencionados em um dos comentários acima) aqui http://www.manifold.net/doc/radian/why_do_non-capture_groups_exist_.htm
fonte
Você pode converter seu inteiro em uma string. Como o sinal de menos não coincide com os dígitos, você não terá anos negativos.
fonte
Eu uso este regex em Java
^(0[1-9]|1[012])[/](0[1-9]|[12][0-9]|3[01])[/](19|[2-9][0-9])[0-9]{2}$
Funciona de 1900 a 9999
fonte
/ ^ \ d {4} $ / Isto irá verificar se uma string consiste em apenas 4 números. Neste cenário, para inserir o ano 989, você pode fornecer 0989.
fonte
Se precisar corresponder YYYY ou YYYYMMDD, você pode usar:
^((?:(?:(?:(?:(?:[1-9]\d)(?:0[48]|[2468][048]|[13579][26])|(?:(?:[2468][048]|[13579][26])00))(?:0?2(?:29)))|(?:(?:[1-9]\d{3})(?:(?:(?:0?[13578]|1[02])(?:31))|(?:(?:0?[13-9]|1[0-2])(?:29|30))|(?:(?:0?[1-9])|(?:1[0-2]))(?:0?[1-9]|1\d|2[0-8])))))|(?:19|20)\d{2})$
fonte
Você também pode usar este.
([0-2][0-9]|3[0-1])\/([0-1][0-2])\/(19[789]\d|20[01]\d)
fonte
00/00/2000
ou31/02/1999
e muitas outras datas falsas.(0[1-9]|1[0-2])
é uma expressão muito melhor para o mêsNo meu caso, eu queria combinar uma string que terminasse com um ano (4 dígitos) como este, por exemplo:
Oct 2020 Nov 2020 Dec 2020 Jan 2021
Ele vai voltar
true
com este:var sheetName = 'Jan 2021'; var yearRegex = new RegExp("\\d{4}$"); var isMonthSheet = yearRegex.test(sheetName); Logger.log('isMonthSheet = ' + isMonthSheet);
O código acima é usado no Apps Script .
fonte
Oct 2020
mas tambémOct 20202
,Oct20202