Expresión regular para permitir espacios entre palabras.


191

Quiero una expresión regular que evite símbolos y solo permita letras y números. La expresión regular a continuación funciona muy bien, pero no permite espacios entre palabras.

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

Por ejemplo, cuando se usa esta expresión regular "HelloWorld" está bien, pero "Hello World" no coincide.

¿Cómo puedo ajustarlo para permitir espacios?

Respuestas:


372

tl; dr

Solo agrega un espacio en tu clase de personaje .

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

 


Ahora, si quieres ser estricto ...

Lo anterior no es exactamente correcto. Debido al hecho de que *significa cero o más , coincidiría con todos los siguientes casos que, por lo general, no significa que coincidan:

  • Una cadena vacía, "".
  • Una cadena compuesta completamente de espacios, "".
  • Una cadena que conduce y / o sigue con espacios, "Hello World".
  • Una cadena que contiene múltiples espacios entre palabras, "Hola mundo".

Originalmente, no creía que valiera la pena entrar en esos detalles, ya que OP hacía una pregunta tan básica que parecía que la rigidez no era una preocupación. Sin embargo, ahora que la pregunta ha ganado popularidad, quiero decir ...

... usa la respuesta de @ stema .

Lo cual, en mi sabor (sin usar \w) se traduce en:

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

(Por favor, vota a @stema independientemente)

Algunas cosas a tener en cuenta sobre esta (y la respuesta de @ stema):

  • Si desea permitir múltiples espacios entre palabras (por ejemplo, si desea permitir espacios dobles accidentales, o si está trabajando con texto copiado y pegado de un PDF), agregue un +espacio después del espacio:

    ^\w+( +\w+)*$
  • Si desea permitir pestañas y líneas nuevas (caracteres de espacio en blanco), reemplace el espacio con un \s+:

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

    Aquí sugiero el +valor predeterminado porque, por ejemplo, los saltos de línea de Windows consisten en dos caracteres de espacio en blanco en secuencia \r\n, por lo que necesitará +capturar ambos.

¿Sigue sin funcionar?

Comprueba qué dialecto de expresiones regulares estás usando. * En idiomas como Java, tendrá que escapar de sus barras diagonales inversas, es decir , \\wy \\s. En idiomas y utilidades más antiguos o más básicos, como sed, \wy \sno están definidos, así que escríbalos con clases de caracteres, por ejemplo , [a-zA-Z0-9_]y [\f\n\p\r\t], respectivamente.

 


* Sé que esta pregunta está etiquetada, pero en base a más de 25,000 visitas, supongo que no solo las personas se están enfrentando a esta pregunta. Actualmente es el primer hit en google para la frase de búsqueda, palabra de espacio de expresión regular .


3
permite cadena vacía
Neha Choudhary

1
¡Guau, tan simple! Gracias. ¿No hay un sitio o algo que uno pueda usar para generar expresiones regulares, para noobs quiero decir ...
Pierre

1
@Pierre: es bastante difícil tomar instrucciones humanas y convertirlas en reglas explícitas. (El lenguaje humano es fluido y lleno de ambigüedades, y nuestros cerebros hacen la mayor parte del trabajo requerido para resolver las cosas y llenar los vacíos. Las computadoras no tienen ese cerebro, y los intentos inteligentes de imitar uno aún no son lo suficientemente potentes. ) Existen herramientas como debuggex.com que representan visualmente su expresión regular, pero por muy atractiva que sea, puede no ser muy útil para principiantes completos. Sin embargo, recomiendo un tutorial interactivo para obtener los conceptos básicos.
Andrew Cheong

1
Sí, también su expresión regular coincidirá si solo hay espacios. Mi respuesta fue al comentario de Neha Choudary.
Rajshekar Reddy

1
@Pierre Tres años después: hoy me encontré con esta pregunta y vi tu comentario; Uso regex hero ( regexhero.net ) para probar expresiones regulares. Creo que la versión en línea solo funciona en Internet Explorer con Silverlight, pero es mejor que nada.
Michael Armes

122

Una posibilidad sería simplemente agregar el espacio en su clase de caracteres, como sugirió acheong87, esto depende de cuán estricto sea su patrón, porque esto también permitiría una cadena que comience con 5 espacios, o cadenas que consisten solo en espacios.

La otra posibilidad es definir un patrón:

Usaré \westo en la mayoría de los sabores de expresiones regulares igual que [a-zA-Z0-9_](en algunos está basado en Unicode)

^\w+( \w+)*$

Esto permitirá una serie de al menos una palabra y las palabras se dividen por espacios.

^ Coincide con el inicio de la cadena

\w+ Une una serie de caracteres de al menos una palabra

( \w+)*es un grupo que se repite 0 o más veces. En el grupo espera un espacio seguido de una serie de caracteres de al menos una palabra

$ coincide con el final de la cadena


Esto: regex101.com/#javascript también proporciona una buena explicación del patrón de expresiones regulares que desea analizar.
Dark Star1

Nice Regex, mucho más simple que muchos [0-9a-z], etc.
George

En mi intérprete de expresiones regulares, descubrí que necesitaba ajustar la cadena completa entre paréntesis para que la primera coincidencia fuera la cadena completa, y no solo las palabras que vienen después del primer espacio. Eso ^- (\w+( \w+)*)$me funcionó.
NoseKnowsTodo


12

Probar con:

^(\w+ ?)*$

Explicación:

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

2
Esto va a inducir un infierno de retroceso.
nhahtdh

1
Por ejemplo, dada una cadena no coincidente ggggggggggggggggggggggggggggggggggggg;, su expresión regular tomará mucho tiempo para alcanzar el resultado debido a un retroceso excesivo.
nhahtdh

Ok, entonces, ¿qué sugieres?
hsz

7

Supongo que no quieres espacio inicial / final. Esto significa que debe dividir la expresión regular en "primer carácter", "cosas en el medio" y "último carácter":

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

o si usa una sintaxis similar a perl:

^\w[\w ]*\w$

Además: si redactó intencionalmente su expresión regular para que también permita cadenas vacías, debe hacer que todo sea opcional:

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

Si solo desea permitir caracteres de espacio único, se ve un poco diferente:

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

Esto coincide con 0..n palabras seguidas de un solo espacio, más una palabra sin espacio. Y hace que todo sea opcional para permitir cadenas vacías.


Espacio y \sno son equivalentes. \scoincide más que solo el espacio.
nhahtdh

@nhahtdh: Gracias por el comentario. Estoy demasiado acostumbrado a la coincidencia de espacios en blanco en general, supongo. La respuesta es fija.
Creinig

¿Es posible que te falte un paréntesis de cierre) en la primera expresión? No estoy seguro de no haberlo intentado.
ssinfod

@ssinfod: Buena captura. En realidad, el paréntesis de apertura es superfluo en ese ejemplo. Gracias.
Creinig

4

Esta expresión regular

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

solo permitirá un espacio entre las palabras y no espacios iniciales o finales.

A continuación se muestra la explicación de la expresión regular:

  1. ^ Afirmar posición al inicio de la cadena
  2. \w+ Unir cualquier carácter de palabra [a-zA-Z0-9_]
    1. Cuantificador: +entre una e ilimitadas veces, tantas veces como sea posible, devolviendo según sea necesario [codicioso]
  3. 1er grupo de captura (\s\w+)*
    1. Cuantificador: *Entre cero e ilimitado veces, tantas veces como sea posible, devolviendo según sea necesario [codicioso]
    2. \s Coincide con cualquier personaje de espacio en blanco [\r\n\t\f ]
    3. \w+ Unir cualquier carácter de palabra [a-zA-Z0-9_]
      1. Cuantificador: +entre una e ilimitadas veces, tantas veces como sea posible, devolviendo según sea necesario [codicioso]
  4. $ Afirmar posición al final de la cadena

2

Esto no permite espacio al principio. Pero permite espacios entre palabras. También permite caracteres especiales entre palabras. Una buena expresión regular para los campos de nombre y apellido.

\w+.*$

Esta respuesta es incorrecta / inexacta. Este patrón coincide con uno o más caracteres alfanuméricos, subrayados y luego cero o más de cualquier carácter que no sea de nueva línea. No es bueno para el OP.
mickmackusa 01 de

2

Solo para alfabetos:

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

Para valor alfanumérico y _:

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

1
no es un buen ejemplo, porque (algo) + no es lo mismo que (algo +). En el primer ejemplo, solo se capturará un único personaje como $ 1.
Znik

0

Pruebe esto: (versión de Python)

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

cambiar el límite superior en función de su conjunto de datos


0

Simplemente agregue un espacio al final de su patrón regex de la siguiente manera:

[a-zA-Z0-9_ ]

-1

Eché un buen vistazo a muchas de estas supuestas respuestas ...

... y bupkis después de buscar Stack Overflow, así como otros sitios, para obtener una expresión regular que coincida con cualquier cadena sin espacios en blanco iniciales o finales y solo un espacio entre palabras de caracteres estrictamente alfabéticos.

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

Por lo tanto, se modifica fácilmente a alfanumérico:

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

(Esto no coincide con palabras simples, solo usa un interruptor / if-else con un simple ^[a-zA-Z0-9]+$ si necesitas capturar palabras sueltas además).

disfruta: D


3
[(?<=\d\s]coincide con un carácter: (, ?, <, =, un dígito o un carácter de espacio en blanco, y que pueden no ser lo que quería decir. Si se suponía que era una retrospectiva, debería serlo (?<=\d\s), pero no tiene sentido allí; la expresión regular nunca coincidiría.
Alan Moore

Para los votantes: no voten las soluciones incorrectas. Confunden a otros usuarios y les hacen creer que regex puede hacer cosas que no hace.
Wiktor Stribiżew

-1

Creo que este funciona bien para un "Nombre completo":

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

-4

tratar .*? para permitir espacios en blanco funcionó para mí


Eso es porque .coincide con todo. Es muy probable que esta no sea la solución aquí.
rubik

coincide con cero o cualquier carácter, depende de lo que haya antes y después de esta secuencia. esto coincidirá con la menor cantidad posible. punto único representa cualquier carácter individual.
Znik
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.