2010-01-07 13 views
9

Parece que no puedo deducir el patrón de expresiones regulares para cadenas coincidentes solo si no contiene espacios en blanco. Por ejemploRegex: no coincide si string contiene espacios en blanco

"this has whitespace".match(/some_pattern/) 

deberían volver nil pero

"nowhitespace".match(/some_pattern/) 

debe devolver el MatchData con toda la cadena. ¿Alguien puede sugerir una solución para lo anterior?

+0

¿Está tratando de determinar si una cadena contiene espacios en blanco, o si una cadena contiene un cierto patrón pero SÓLO si no hay espacios en blanco? – mletterle

+0

Básicamente quiero que la coincidencia devuelva nil si la cadena contiene espacios en blanco. –

Respuesta

19

En Rubí creo que sería

/^\S*$/ 

Esto significa "st arte, coincide con cualquier número de caracteres no está en blanco, extremo "

+0

¡Ahh! Me faltaba el ancla de final de línea al final. ¡Aclamaciones! –

+0

@Bart, tenga en cuenta que '\ n' y' \ r' también se consideran caracteres de espacio en blanco. –

+4

En su lugar, podría querer '/ \ A \ S * \ Z /', ya que coincidirá con el inicio y el final de la cadena en lugar del inicio y el final de las líneas. '" lineone \ nlinetwo "' emparejado con '/^\ S * $ /' devolverá '" lineone "' –

3
>> "this has whitespace".match(/^\S*$/) 
=> nil 
>> "nospaces".match(/^\S*$/) 
=> #<MatchData "nospaces"> 

^ = Comienzo de cadena

\ S = no está en blanco, * = 0 o más

$ = final de la cadena

1
"nowhitespace".match(/^[^\s]*$/) 
1

que desea buscar:

/^\S*$/ 

que dice" coincidir el comienzo de la cadena, y cero o más caracteres no está en blanco, a continuación, el final de la cadena ". La convención para las clases de caracteres predefinidas es que una letra minúscula se refiere a una clase, mientras que una letra mayúscula se refiere a su negación. Por lo tanto, \s se refiere a los espacios en blanco, mientras que \S se refiere a espacios no en blanco.

3

No está seguro de que puede hacerlo en un patrón, pero se puede hacer algo como:

"string".match(/pattern/) unless "string".match(/\s/) 
+0

+1 por pensar en la pregunta de manera diferente ...la pregunta podría interpretarse como una coincidencia de una cadena que contenga el patrón 'x' siempre que la cadena no incluya espacios en blanco ... –

0

str.match(/^\S*some_pattern\S*$/)

4

quizás pueda buscar para espacios, una continuación niega el resultado:

"str".match(/\s/).nil? 
Cuestiones relacionadas