Pregunta

Pregunta fácil esta vez.

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

Por ejemplo,

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

y

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

ambos devuelven verdadero (esperaría falso).

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

Ideas? Supongo que es algo pequeño.

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

Editar1:

Encontré esto , pero no parece responder al problema que estoy teniendo.

Editar2:

Quería responder a Kevin y Sugerencias de Joel . Estas sugerencias serían realmente más rápidas, pero no logran la flexibilidad que necesito en este caso, por lo que si encuentra esta pregunta mediante la búsqueda, definitivamente busque si sus respuestas se ajustan a sus necesidades. En mi caso, la expresión regular se pasa a un método de validación DataTable que recorre cada fila y verifica que el contenido de esa fila en una columna específica coincida con el RegEx que se está pasando. Dado que reutilizaré este método para varias otras DataTables que se están validando, quería:

  1. Use Regex para habilitar la gama más amplia de validaciones, y
  2. Siempre busque una coincidencia positiva (es decir, en lugar de usar! Regex.IsMatch (celda, variable regex), siempre quise confiar en poder usar Regex.IsMatch (celda, variable regex) ya que la mayoría de las tablas de datos invocando este método utilizará la coincidencia positiva en lugar de la negativa.

Espero que eso ayude.

¿Fue útil?

Solución

Su solución es la mitad correcta. La coincidencia que ves es para los otros personajes. Lo que quieres decir es algo así como ¡Hola! No quiero ver este personaje en toda la cadena " ;.

En ese caso, usted hace:

Regex.IsMatch("103","^[^0]*<*>quot;)

Otros consejos

El patrón [^ 0] coincidirá con cualquier carácter que no sea un cero. En ambos ejemplos, el patrón coincidirá con el primer carácter (" 1 "). Para probar si toda la cadena no contiene ceros, el patrón debe ser " ^ [^ 0] * $ " ;. Esto dice lo siguiente: Comience al principio de la cadena, haga coincidir un número arbitrario de caracteres que no sean ceros, seguido inmediatamente por el final de la cadena. Cualquier cadena que contenga un cero fallará. Cualquier cadena que no contenga ceros pasará.

si está buscando un solo carácter en una cadena, regex parece un poco exagerado. ¿Por qué no solo usar .IndexOf o .Contains?

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

Estás poniendo tu negación en el lugar equivocado. [^ x] coincidirá con todo lo que no sea x. Si x está en la cadena, la cadena aún coincide con la expresión si también hay otros caracteres. En su lugar, desea hacer coincidir verdadero si x está allí y luego negar el resultado de la función:

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

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

No es que con estos simples ejemplos, el String.IndexOf () o el String.Contains () sean una mejor opción.

Encontré esta pregunta buscando lo mismo pero JavaScript. La expresión de arriba no funcionó en mi caso, pero me encontré con la expresión de abajo que sí. (En caso de que alguien más que busque una solución de JavaScript termine aquí también.)

^((?!0).)*$

Esta construcción se llama Negative Lookahead

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top