Expressão regular para permitir espaços entre as palavras


188

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

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

Por exemplo, ao usar esta expressão regular "HelloWorld", tudo bem, mas "Hello World" não corresponde.

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

Respostas:


367

tl; dr

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

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

 


Agora, se você quer ser rigoroso ...

O exposto acima não é exatamente correto. Devido ao fato de *significar zero ou mais , ele corresponderia a todos os seguintes casos que normalmente não significariam corresponder:

  • Uma sequência vazia, "".
  • Uma sequência composta inteiramente de espaços "".
  • Uma sequência que leva e / ou arrasta com espaços, "Hello World".
  • Uma sequência que contém vários espaços entre as palavras, "Hello World".

Originalmente, eu não achava que esses detalhes valiam a pena, pois a OP fazia uma pergunta tão básica que parecia que o rigor não era uma preocupação. Agora que a pergunta ganhou popularidade, no entanto, quero dizer ...

... use a resposta de @ stema .

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

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

(Por favor, vote @stema independentemente.)

Algumas coisas a serem observadas sobre essa resposta (e da @ stema):

  • Se você deseja permitir vários espaços entre as palavras (por exemplo, se você deseja permitir espaços duplos acidentais ou se estiver trabalhando com texto colado em um PDF), adicione um +após o espaço:

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

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

    Aqui, sugiro o +padrão por que, por exemplo, as quebras de linha do Windows consistem em dois caracteres de espaço em branco em sequência \r\n, portanto, você precisará +capturar os dois.

Ainda não funciona?

Verifique qual dialeto de expressões regulares você está usando. * Em linguagens como Java, você terá que escapar de suas barras invertidas, ou seja , \\we \\s. Em linguagens e utilitários mais velhos ou mais básicos, como sed, \we \snão estão definidos, assim escrevê-los com classes de personagens, por exemplo, [a-zA-Z0-9_] e [\f\n\p\r\t], respectivamente.

 


* Eu sei que esta pergunta está marcada, mas com base em mais de 25.000 visualizações, acho que não são apenas as pessoas que se deparam com essa pergunta. Atualmente, é o primeiro hit no google para a frase de pesquisa, palavra do espaço de expressão regular .


3
permite string vazia
Neha Choudhary 12/12

1
Uau, tão simples! obrigado. Isnt há um site ou algo que se pode usar para gerar expressões regex, por noobs Quero dizer ...
Pierre

1
@Pierre - É bastante difícil seguir instruções humanas e convertê-las em regras explícitas. (A linguagem humana é fluida e cheia de ambiguidades, e nosso cérebro faz a maior parte do trabalho necessário para resolver as coisas e preencher as lacunas. Os computadores não têm um cérebro assim, e as tentativas inteligentes de imitar uma ainda não são poderosas o suficiente. ) Existem ferramentas como o debuggex.com que representam seu regex visualmente, mas por mais atraente que seja, pode não ser muito útil para iniciantes completos. No entanto, eu recomendo um tutorial interativo para entender o básico.
Andrew Cheong

1
Sim, também o seu regex corresponderá se houver apenas espaços. Minha resposta foi ao comentário de Neha Choudary.
Rajshekar Reddy 23/03

1
@ Pierre Três anos depois - me deparei com esta pergunta hoje, vi seu comentário; Eu uso o herói regex ( regexhero.net ) para testar expressões regulares. Eu acho que a versão online funciona apenas no Internet Explorer com Silverlight, mas é melhor que nada.
26917 Michael Armes

120

Uma possibilidade seria apenas adicionar o espaço à sua classe de personagem, como sugerido por acheong87, isso depende de quão rigoroso você é em seu padrão, porque isso também permitiria uma string iniciando com 5 espaços ou strings consistindo apenas de espaços.

A outra possibilidade é definir um padrão:

Vou usar \wisso na maioria dos tipos de expressões regulares, 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.

^ Corresponder ao início da string

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

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

$ corresponde ao final da string


Isso: regex101.com/#javascript também fornece uma explicação tão boa para o padrão de regex que você deseja analisar.
Escuro Star1

Bom Regex, muito mais simples, em seguida, um monte de [0-9a-z] etc
George


11

Tente com:

^(\w+ ?)*$

Explicação:

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

2
Isso vai induzir o retorno ao inferno.
Nhahtdh 18/03

1
Por exemplo, dada uma sequência não correspondente ggggggggggggggggggggggggggggggggggggg;, seu regex levará muito tempo para alcançar o resultado devido ao retorno excessivo.
Nhhtdh 18/03

Ok, então o que você sugere?
Hsz 18/03

7

Presumo que você não queira espaço à esquerda / à direita. Isso significa que você deve dividir a regex em "primeiro caractere", "itens no meio" e "último caractere":

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

ou se você usar uma sintaxe semelhante a perl:

^\w[\w ]*\w$

Além disso: se você intencionalmente redigiu seu regex de que ele também permite Strings vazias, é necessário tornar a coisa toda opcional:

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

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

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

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 seqüências vazias.


Espaço e \snão são equivalentes. \scorresponde mais do que apenas espaço.
Nhahtdh 18/03

@ nhahtdh: Obrigado pelo comentário. Estou muito acostumado a combinar espaços em branco em geral, acho ... A resposta foi corrigida.
creinig

É possível que esteja faltando um parêntese de fechamento) na primeira expressão? Não tenho certeza se não tentei.
ssinfod

@ ssinfod: Boa captura. Na verdade, o parêntese de abertura é supérfluo nesse exemplo. Obrigado.
creinig

3

Essa expressão regular

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

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

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

  1. ^ Afirmar posição no início da string
  2. \w+ Corresponder a qualquer caractere de palavra [a-zA-Z0-9_]
    1. Quantificador: +entre uma e várias vezes, quantas vezes for possível, devolvendo o que for necessário [ganancioso]
  3. 1º grupo de captura (\s\w+)*
    1. Quantificador: *entre zero e tempo ilimitado, quantas vezes for possível, devolvendo conforme necessário [ganancioso]
    2. \s Corresponde a qualquer caractere de espaço em branco [\r\n\t\f ]
    3. \w+ Corresponder a qualquer caractere de palavra [a-zA-Z0-9_]
      1. Quantificador: +entre uma e várias vezes, quantas vezes for possível, devolvendo o que for necessário [ganancioso]
  4. $ Afirmar posição no final da string

2

Isso não permite espaço no começo. Mas permite espaços entre as palavras. Também permite caracteres especiais entre as palavras. Uma boa regex para os campos Nome e Sobrenome.

\w+.*$

Esta resposta está incorreta / imprecisa. Esse padrão corresponde a um ou mais sublinhados alfanuméricos e zero ou mais de qualquer caractere que não seja de nova linha. Não é bom para o OP.
Mckmackusa

2

Apenas para alfabetos:

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

Para valor alfanumérico e _:

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

1
não é um bom exemplo, porque (algo) + não é o mesmo que (algo +). No primeiro exemplo, apenas um caractere será capturado como $ 1.
Znik

0

Experimente o seguinte: (versão Python)

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

altere o limite superior com base no seu conjunto de dados


0

Basta adicionar um espaço ao final do seu padrão regex da seguinte maneira:

[a-zA-Z0-9_ ]

-1

Deu uma boa olhada em muitas dessas supostas respostas ...

... e bupkis depois de vasculhar o Stack Overflow, bem como outros sites, em busca de uma regex que corresponda a qualquer sequência sem espaço em branco inicial ou final e apenas um espaço entre as 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 corresponde a palavras únicas, mas apenas use um switch / if-else com um simples ^[a-zA-Z0-9]+$ se você precisar capturar palavras únicas.)

apreciar: D


3
[(?<=\d\s]corresponde a um caractere: (, ?, <, =, um dígito, ou um espaço em branco, e que pode não ser o que você quis dizer. Se deveria ser um olhar para trás, deveria ser (?<=\d\s), mas não faz sentido lá; o regex nunca corresponderia.
Alan Moore

Para promotores: Não promova soluções erradas. Eles confundem outros usuários e os fazem acreditar que o regex pode fazer coisas que não faz.
Wiktor Stribiżew

-1

Acho que este funciona bem para um "FullName":

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

-4

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


Isso porque .combina com tudo. É muito provável que essa não seja a solução aqui.
rubik 12/09

corresponde a zero ou a qualquer caractere, dependendo do que é antes e depois dessa sequência. isso corresponderá o mínimo possível. ponto único representa qualquer caractere único.
Znik 13/11/19
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.