Saltar al contenido

En una expresión regular, coincide con una cosa u otra, o ambas

Solución:

El método completamente general, dadas las expresiones regulares /^A$/ y /^B$/ es:

/^(A|B|AB)$/

es decir

/^([0-9]+|.[0-9]+|[0-9]+.[0-9]+)$/

Tenga en cuenta que los demás han utilizado la estructura de su ejemplo para hacer una simplificación. Específicamente, ellos (implícitamente) lo factorizaron, para sacar el común [0-9]* y [0-9]+ factores a la izquierda y a la derecha.

El trabajo para esto es:

  • todos los elementos de la alternancia terminan en [0-9]+, así que saca eso: /^(|.|[0-9]+.)[0-9]+$/
  • Ahora tenemos la posibilidad de la cadena vacía en la alternancia, así que reescríbela usando ? (es decir, use la equivalencia (|a|b) = (a|b)?): /^(.|[0-9]+.)?[0-9]+$/
  • Nuevamente, una alternancia con un sufijo común (. esta vez): /^((|[0-9]+).)?[0-9]+$/
  • el patrón (|a+) es lo mismo que a*, así que finalmente: /^([0-9]*.)?[0-9]+$/

Sí, puede hacer coincidir todos estos con una expresión de este tipo:

/^[0-9]*.?[0-9]+$/

Tenga en cuenta que tampoco coincide con la cadena vacía (su última condición).

Seguro. Quieres el cuantificador opcional, ?.

/^(?=.)([0-9]+)?(.[0-9]+)?$/

Lo anterior tiene un aspecto un poco incómodo, pero quería mostrarte tu patrón exacto con algunos ?se incluye. En esta versión, (?=.) se asegura de que no acepte una cadena vacía, ya que he hecho ambas cláusulas opcionales. Una versión más sencilla sería esta:

/^d*.?d+$/

Esto satisface sus requisitos, incluida la prevención de una cadena vacía.

Tenga en cuenta que hay muchas formas de expresar esto. Algunas son largas y otras muy concisas, pero se vuelven más complejas dependiendo de lo que intente permitir / no permitir.

Editar:

Si desea hacer coincidir esto dentro de una cadena más grande, le recomiendo dividir y probar los resultados con /^d*.?d+$/. De lo contrario, correrá el riesgo de que coincidan cosas como aaa.123.456.bbb o coincidencias faltantes (confía en mí, lo harás. La falta de soporte de búsqueda hacia atrás de JavaScript asegura que será posible romper cualquier patrón que se me ocurra).

Si sabe con certeza que no obtendrá cadenas como las anteriores, puede usar saltos de palabras en lugar de ^$ anclas, pero se complicará porque no hay un salto de palabra entre . y (un espacio).

/(bd+|B.)?d*b/g

Eso debería bastar. Bloqueará cosas como aaa123.456bbb, pero permitirá 123, 456, o 123.456. Permitirá aaa.123.456.bbb, pero como he dicho, necesitará dos pasos si quiere manejar eso de manera integral.

Edición 2: su caso de uso

Si desea permitir espacios en blanco al principio, marcas negativas / positivas y palabras al final, esas son reglas bastante estrictas. Eso es bueno. Puede agregarlos al patrón más simple anterior:

/^s*[-+]?d*.?d+[a-z_s]*$/i

Permitir miles de grupos complica enormemente las cosas, y te sugiero que eches un vistazo a la respuesta a la que he vinculado. Aquí está el patrón resultante:

/^s*[-+]?(d+|d{1,3}(,d{3})*)?(.d+)?b(s[a-z_s]*)?$/i

los b asegura que la parte numérica termine con un dígito y sea seguida por al menos un espacio en blanco.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *