expressão regular para letras, números e - _

98

Estou tendo problemas para verificar no PHP se um valor é uma das seguintes combinações

  • letras (maiúsculas ou minúsculas)
  • números (0-9)
  • sublinhado (_)
  • traço (-)
  • ponto (.)
  • sem espaços! ou outros personagens

alguns exemplos:

  • OK: "screen123.css"
  • OK: "screen-new-file.css"
  • OK: "screen_new.js"
  • NÃO OK: "tela de novo arquivo.css"

Acho que preciso de uma regex para isso, pois preciso lançar um erro quando uma string dada contém outros caracteres além dos mencionados acima.

Jorre
fonte
^ [\ w .-] * $ -> Isso obterá todos os nomes de arquivos.
Badri Gs

Respostas:

205

O padrão que você deseja é algo como ( veja em rubular.com ):

^[a-zA-Z0-9_.-]*$

Explicação:

  • ^ é o começo da âncora de linha
  • $ é a âncora do fim da linha
  • [...] é uma definição de classe de personagem
  • * é a repetição "zero ou mais"

Observe que o traço literal -é o último caractere na definição da classe de caracteres, caso contrário, tem um significado diferente (ou seja, intervalo). O .também tem um significado diferente fora das definições de classe de caractere, mas por dentro, é apenas um literal.

Referências


Em PHP

Aqui está um snippet para mostrar como você pode usar este padrão:

<?php

$arr = array(
  'screen123.css',
  'screen-new-file.css',
  'screen_new.js',
  'screen new file.css'
);

foreach ($arr as $s) {
  if (preg_match('/^[\w.-]*$/', $s)) {
    print "$s is a match\n";
  } else {
    print "$s is NO match!!!\n";
  };
}

?>

As impressões acima ( conforme visto em ideone.com ):

screen123.css is a match
screen-new-file.css is a match
screen_new.js is a match
screen new file.css is NO match!!!

Observe que o padrão é ligeiramente diferente, usando em seu \wlugar. Esta é a classe de caractere para "caractere de palavra".

Referências API


Nota na especificação

Isso parece seguir sua especificação, mas observe que corresponderá a itens como .....etc., que podem ou não ser o que você deseja. Se você puder ser mais específico sobre qual padrão deseja corresponder, a regex será um pouco mais complicada.

O regex acima também corresponde à string vazia. Se você precisar de pelo menos um caractere, use +(um ou mais) em vez de *(zero ou mais) para a repetição.

Em qualquer caso, você pode esclarecer ainda mais sua especificação (sempre ajuda ao fazer perguntas sobre regex), mas espero que você também possa aprender como escrever o padrão com as informações acima.

poligenelubrificantes
fonte
Consulte também ideone.com/5DMCa para uma especificação diferente que pode ser mais do que você deseja. Vá e volte comigo sobre o rubular se quiser desenvolver a especificação comigo.
poligenelubrificantes de
Estou usando o Tornado e preciso capturar nomes em html, então usei isso com base na sua resposta; ^/([a-zA-Z0-9._-]*\.html)$
NuclearPeon
Eu adicionaria outra regra que é: o último caractere deve ser alfanumérico. Regex atualizado:/[a-zA-Z0-9]+(\.[a-zA-Z0-9]+){2,}[a-zA-Z0-9^]$/
Consta Gorgan
Usuários de Go (golang), atenção, o padrão aqui resultará em falseliterais de string brutos vazios. Playground . Use a solução de @ nonopolarity abaixo .
BentCoder
14

você pode usar

^[\w\d_.-]+$

o +é para se certificar de que tem pelo menos 1 personagem. Precisa de ^e $para denotar o início e o fim, caso contrário, se a string tiver uma correspondência no meio, como @@@@xyz%%%%então ainda é uma correspondência.

não polaridade
fonte
3
Coloque o -primeiro no conjunto, para evitar definir um intervalo. E \wcobre alfanuméricos e sublinhados. Então você precisa [\w.-]+.
Richard
Obrigado, isso funciona bem para mim: ^ [\ w \ d _.-] + \. (Csv | CSV) $
Dharam Mali
Isso também está em conformidade com os literais de string bruta vazios de Go (golang), ao passo que a resposta aceita não, então os usuários de Go continuam com esta solução. Playground
BentCoder
8

Para realmente cobrir seu padrão, ou seja, nomes de arquivo válidos de acordo com suas regras, acho que você precisa de um pouco mais. Observe que isso não corresponde aos nomes de arquivo legais da perspectiva do sistema . Isso seria dependente do sistema e mais liberal no que aceita. O objetivo é corresponder aos seus padrões aceitáveis.

^([a-zA-Z0-9]+[_-])*[a-zA-Z0-9]+\.[a-zA-Z0-9]+$

Explicação:

  • ^Corresponde ao início de uma string. Isso (mais a correspondência final) força a string a se adequar à expressão exata, não apenas a conter uma substring que corresponda à expressão.
  • ([a-zA-Z0-9]+[_-])*Zero ou mais ocorrências de uma ou mais letras ou números seguidos por um sublinhado ou travessão. Isso faz com que todos os nomes que contêm um traço ou sublinhado tenham letras ou números entre eles.
  • [a-zA-Z0-9]+Uma ou mais letras ou números. Isso cobre todos os nomes que não contêm sublinhado ou travessão.
  • \.Um período literal (ponto). Força o nome do arquivo a ter extensão e, por exclusão do resto do padrão, permite que seja utilizado apenas o ponto final entre o nome e a extensão. Se você quiser mais de uma extensão, que também pode ser tratada usando a mesma técnica do traço / sublinhado, apenas no final.
  • [a-zA-Z0-9]+Uma ou mais letras ou números. A extensão deve ter pelo menos um caractere e deve conter apenas letras e números. Isso é típico, mas se você quiser permitir sublinhados, isso também pode ser resolvido. Você também pode fornecer um intervalo de comprimento em {2,3}vez de um ou mais +combinadores, se for mais apropriado.
  • $Combine o final da string. Veja o personagem inicial.
Tvanfosson
fonte
6

Este é o padrão que você está procurando

/^[\w-_.]*$/

O que isto significa:

  • ^ Início da corda
  • [...] Corresponder caracteres dentro
  • \w Qualquer palavra então 0-9 a-z A-Z
  • -_.Combinar -e _e.
  • * Zero ou mais do padrão ou ilimitado
  • $ Fim da corda

Se você deseja limitar a quantidade de caracteres:

/^[\w-_.]{0,5}$/

{0,5}Significa 0-5personagens

Fletcher Ripp
fonte
var a = / ^ \ w * $ / g a.test ("46545") e o resultado era falso
Dipak
1
Observe que \winclui_
hxpax
4

Algo assim deve funcionar

$code = "screen new file.css";
if (!preg_match("/^[-_a-zA-Z0-9.]+$/", $code))
{
    echo "not valid";
}

Isso irá ecoar "não é válido"


fonte
2

[A-Za-z0-9_.-]*

Isso também corresponderá a strings vazias, se você não quiser que troque o último *por um+

Cientista maluco
fonte