expressão regular para permitir espaços entre palavras

Eu quero uma expressão regular que evite símbolos e permita apenas letras e números. Esta regex funciona muito bem, mas não permite espaços entre as palavras.

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

Por exemplo, ao usar essa expressão regular, “HelloWorld” é bom, mas “Hello World” não corresponde.

Como posso ajustá-lo para permitir espaços?

tl; dr

Basta adicionar um espaço na sua class de personagem .

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


Agora, se você quer ser rigoroso …

O acima não é exatamente correto. Devido ao fato de que * significa zero ou mais , ele corresponderia a todos os casos a seguir, que normalmente não corresponderiam a:

  • Uma string vazia, “”.
  • Uma string composta inteiramente de espaços “”.
  • Uma string que leva e / ou rastreia com espaços, “Hello World”.
  • Uma string que contém vários espaços entre palavras, “Hello World”.

Originalmente, eu não achava que tais detalhes valessem a pena, já que OP estava fazendo uma pergunta tão básica que parecia que a rigidez não era uma preocupação. Agora que a questão ganhou alguma popularidade no entanto, eu quero dizer …

… use a resposta do @ stema .

Que, no meu sabor (sem usar \w ) se traduz em:

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

(Por favor, submeta @stema independentemente disso)

Algumas coisas a notar sobre isso (e @ stema) respondem:

  • Se você quiser permitir vários espaços entre palavras (digamos, se quiser permitir espaços duplos acidentais ou se estiver trabalhando com texto copiado e colado de um PDF), adicione um + após o espaço:

     ^\w+( +\w+)*$ 
  • Se você quiser permitir guias e novas linhas (caracteres de espaços em branco), substitua o espaço por \s+ :

     ^\w+(\s+\w+)*$ 

    Aqui eu sugiro o + por padrão porque, por exemplo, as quebras de linha do Windows consistem em dois caracteres em branco na sequência, \r\n , então você precisará do + para capturar ambos.

Ainda não funciona?

Verifique o dialeto de expressões regulares que você está usando. * Em linguagens como Java você terá que escaping de suas barras invertidas, ou seja , \\w e \\s . Em linguagens e utilitários mais antigos ou mais básicos, como sed , \w e \s não são definidos, então escreva-os com classs de caracteres, por exemplo [a-zA-Z0-9_] e [\f\n\p\r\t] , respectivamente.


* Eu sei que esta questão está marcada como vb.net , mas com base em mais de 25.000 visualizações, acredito que não sejam apenas as pessoas que estão enfrentando essa questão. Atualmente é o primeiro hit no google para a frase de pesquisa, a palavra de espaço de expressão regular .

Uma possibilidade seria apenas adicionar o espaço em sua class de caracteres, como acheong87 sugeriu, isso depende de quão estrito você é em seu padrão, porque isso também permitiria uma string começando com 5 espaços, ou strings consistindo apenas de espaços.

A outra possibilidade é definir um padrão:

Eu vou usar \w isso é na maioria dos sabores regex o mesmo que [a-zA-Z0-9_] (em alguns é baseado em Unicode)

 ^\w+( \w+)*$ 

Isso permitirá uma série de pelo menos uma palavra e as palavras são divididas por espaços.

^ Combine o começo da corda

\w+ Corresponde a uma série de pelo menos um caractere de palavra

( \w+)* é um grupo que é repetido 0 ou mais vezes. No grupo, espera-se um espaço seguido por uma série de pelo menos um caractere de palavra

$ corresponde ao final da string

Este trabalhou para mim

 ([\w ]+) 

Experimente com:

 ^(\w+ ?)*$ 

Explicação:

 \w - alias for [a-zA-Z_0-9] "whitespace"? - allow whitespace after word, set is as optional 

Eu suponho que você não quer espaço inicial / final. Isto significa que você tem que dividir o regex em “primeiro caracter”, “coisas no meio” e “último caractere”:

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

ou se você usar uma syntax perl-like:

 ^\w[\w ]*\w$ 

Além disso: Se você expressou intencionalmente o seu regex que também permite strings vazias, você tem que fazer a coisa toda opcional:

 ^(\w[\w ]*\w)?$ 

Se você quiser permitir apenas caracteres de espaço único, ele parece um pouco diferente:

 ^((\w+ )*\w+)?$ 

Isso corresponde a 0.n palavras seguidas por um único espaço, mais uma palavra sem espaço. E torna a coisa toda opcional para permitir sequências vazias.

Isso não permite espaço no começo. Mas permite espaços entre palavras. Também permite caracteres especiais entre palavras. Um bom regex para os campos FirstName e LastName.

 \w+.*$ 

Apenas para alfabetos:

 ^([a-zA-Z])+(\s)+[a-zA-Z]+$ 

Para o valor alfanumérico e _ :

 ^(\w)+(\s)+\w+$ 

Esta expressão regular

 ^\w+(\s\w+)*$ 

só permitirá um único espaço entre as palavras e nenhum espaço à esquerda ou à direita.

Abaixo está a explicação da expressão regular:

  1. ^ Afirme a posição no começo da corda
  2. \w+ Corresponde a qualquer caractere de palavra [a-zA-Z0-9_]
    1. Quantificador: + Entre um e ilimitado, tantas vezes quanto possível, devolvendo conforme necessário [ganancioso]
  3. 1º grupo de captura (\s\w+)*
    1. Quantificador: * Entre zero e tempos ilimitados, tantas vezes quanto possível, devolvendo conforme necessário [ganancioso]
    2. \s Corresponde a qualquer caractere de espaço em branco [\r\n\t\f ]
    3. \w+ Corresponde a qualquer caractere de palavra [a-zA-Z0-9_]
      1. Quantificador: + Entre um e ilimitado, tantas vezes quanto possível, devolvendo conforme necessário [ganancioso]
  4. $ Assert position no final da string

Tive uma boa olhada em muitas dessas supostas respostas …

… e bupkis após vasculhar o Stack Overflow, bem como outros sites, para um regex que corresponda a qualquer sequência sem espaço em branco inicial ou final e apenas um único espaço entre palavras de caractere estritamente alfa.

 ^[a-zA-Z]+[(?<=\d\s]([a-zA-Z]+\s)*[a-zA-Z]+$ 

Assim facilmente modificado para alfanumérico:

 ^[a-zA-Z0-9]+[(?<=\d\s]([a-zA-Z0-9]+\s)*[a-zA-Z0-9]+$ 

(Isso não combina com palavras isoladas, mas apenas use um switch / if-else com um simples ^[a-zA-Z0-9]+$ se você precisar capturar palavras únicas além disso.)

aproveite: D

Tente isto: (versão em Python)

 "(A-Za-z0-9 ){2, 25}" 

alterar o limite superior com base no seu dataset

Eu acho que este funciona bem para um “FullName”:

 ([a-z',.-]+( [a-z',.-]+)*){1,70}/ 

Todos os códigos acima não funcionam quando o usuário inclui o caractere do teclado. Então aqui está o regx quando o usuário tem permissão para adicionar qualquer caractere ou palavra, mas eles podem colocar espaços entre as palavras. Experimente este.

  ^[^ ]+( [^ ]+)*$ 

experimentar .*? para permitir espaços em branco funcionou para mim

    Intereting Posts