2008-10-13 17 views
33

Pregunta fácil esta vez.RegEx para saber si una cadena no contiene un carácter específico

Estoy tratando de probar si una cadena no contiene un carácter con expresiones regulares o no. Pensé que la expresión era de la forma "[^ x]" donde x es el personaje que no desea que aparezca, pero que no parece estar funcionando.

Por ejemplo,

Regex.IsMatch("103","[^0]") 

y

Regex.IsMatch("103&","[^&]") 

ambos devuelven verdadero (yo esperaría falsa).

Empecé a usar "[^&]" y pensé que tal vez el & tenía que ser escapado como \ &, pero no parecía hacer la diferencia.

Ideas? Supongo que es algo pequeño.

Además, estoy usando .NET, así que tenlo en cuenta.

Edit1:

he encontrado this, pero no parece responder a la cuestión que estoy teniendo.

Edit2:

quería responder a Kevin y sugerencias Joel 's. De hecho, estas sugerencias serían más rápidas, pero no logran la flexibilidad que necesito en este caso, así que si encuentra esta pregunta a través de la búsqueda, definitivamente mire si sus respuestas se ajustan a sus necesidades. En mi caso, la expresión regular se transfiere a un método de validación de DataTable que recorre cada fila y verifica que el contenido de esa fila en una columna específica coincida con el RegEx que se transfiere. Como voy a reutilizar este método para varias otras tablas de datos que están siendo validados, que quería:

  1. usar expresiones regulares para permitir la más amplia gama de validaciones y
  2. siempre busco un resultado positivo (es decir, en lugar de utilizar Regex.IsMatch (celular! , regexvariable), quería confiar en siempre poder usar Regex.IsMatch (celda, variable regex) ya que la mayoría de los DataTables que invocan este método usarán la coincidencia positiva en lugar de la negativa.

Espero que eso ayude.

+0

Si sólo está navegando por la presencia de un solo carácter, que pueda pasar mucho mejor sin expresiones regulares. Kevin tiene razón: use .IndexOf() o algo más simple. Será más legible, más claro y más rápido. – ruquay

Respuesta

51

Su solución está a la mitad. El partido que ves es para los otros personajes. Lo que quieres decir es algo así como "¡oye! No quiero ver a este personaje en toda la cadena".

En ese caso, lo hace:

Regex.IsMatch("103","^[^0]*$") 
+0

Gracias! También probé "^ [^ 0] $", pero renuncié a^y $, ya que causaba que todo fuera falso, solo necesitaba ese asterisco. Gracias de nuevo, mis "dos problemas" ahora han vuelto a cero. – jerhinesmith

+4

Supongo que! Regex.IsMatch ("103", "0") sería más rápido en realidad. – Kip

+0

Estoy usando esto, no quiero ver los caracteres '?', '[', Y ']', probé '^ [^?] * $', Eso funcionó para '?' Basado en lo anterior ejemplo, pero cuando agrego los caracteres de corchete no funciona ... '^ [^? []] * $' – raffian

4

El primer carácter del analizador alcanza es "1", lo cual es cierto para [^ 0] y también cierto para [^ &], por lo que por lo tanto, volverá cierto en ambos ejemplos.

7

si está buscando un único carácter en una cadena, la expresión regular parece un poco exagerada. ¿Por qué no usar simplemente .IndexOf o .Contains?

+0

Esto funcionaría, pero estoy tratando de escribir un validador DataTable usando decoradores y quería un método que me permitiera extender a otras coincidencias de cadenas (ya sea inclusivo o exclusivo). – jerhinesmith

2

Está colocando su negación en el lugar equivocado. [^x] coincidirá con cualquier cosa que no sea x. Si x está en la cadena, la cadena aún coincide con la expresión si hay otros caracteres también. En su lugar, que desea hacer coincidir verdadera si x está ahí, y luego negar el resultado de la función:

Not Regex.IsMatch("103", "0") 

Not Regex.IsMatch("103&", "&") 

No es que con estos ejemplos sencillos, el String.IndexOf normal() o String.Contains() serían una mejor elección

16

El patrón [^ 0] coincidirá con cualquier carácter que no sea cero. En sus dos ejemplos, el patrón coincidirá con el primer carácter ("1"). Para comprobar si la cadena completa no contiene ceros, el patrón debería ser "^ [^ 0] * $". Esto se lee de la siguiente manera: Comience por el principio de la cadena, haga coincidir una cantidad arbitraria de caracteres que no sean ceros, seguida inmediatamente por el final de la cadena. Cualquier cadena que contenga un cero fallará. Cualquier cadena que no contenga ceros pasará.

+1

¡Gran explicación! – Mez

2

Me encontré con esta pregunta en busca de lo mismo, pero para JavaScript. La expresión anterior no funcionó en mi caso, pero me encontré con la expresión siguiente, que sí lo hizo. (Sólo en caso de cualquier otra persona en busca de una solución JavaScript termina aquí también.)

^((0 ?!).) * $

Cuestiones relacionadas