Estoy tratando de implementar una búsqueda usando expresiones regulares. Para validar si el valor ingresado es una expresión regular válida en el cuadro de búsqueda, estoy usando el código fuente de una biblioteca regex-validate (BIBLIOTECA DE VALIDACIÓN DE REGEX - regex-regex )
Si el valor ingresado es una expresión regular válida, lo estoy analizando en una expresión regular usando el código fuente de esta biblioteca Regex-Parse ) (BIBLIOTECA DE ANÁLISIS - Regex Parser ) para filtrar/buscar usando la expresión regular analizada. Aquí hay un fragmento de código para lo mismo
import { useState } from "react"; import "./styles.css"; import { re, RegexParser } from "./regexValidation"; export default function App() { const [val, setVal] = useState(""); const [validRegex, setValidRegex] = useState(false); const validateRegex = (val: string) => { setVal(val); if (val === "") { setValidRegex(false); return; } // to check if the entered value(val) is a valied regex in string if (re.test(val)) { setValidRegex(false); // parsing the entered value(val) to a regularexpression const convertToRegex = RegexParser(val); //filtering logic to filter based on convertToRegex variable } else { setValidRegex(true); } }; const handleChange = (e: any) => { validateRegex(e.target.value); }; return ( <div className="App"> <input value={val} onChange={handleChange}></input> <h1>{validRegex ? "inValidRegex" : "ValidRegex"}</h1> </div> ); }Enlace CodeSandBox para la búsqueda de expresiones regulares RegexValidationSearch
Me enfrento a un problema cuando el usuario ingresa '/?/' o '/*/', re.test(val) devuelve verdadero, lo que implica que es una expresión regular válida, pero cuando intenta analizarse, esa es esta línea de código const convertToRegex = RegexParser(val) arroja el siguiente error RegexError
¿Hay alguna forma de solucionar esto de modo que esta línea de código re.test(val) devuelva falso cuando el usuario ingresa una expresión regular no válida allí, lo que implica que es una expresión regular no válida (en formato de cadena) y, por lo tanto, no hay necesidad de analizarlo a una expresión regular
Parece que podría ser una incompatibilidad entre las dos bibliotecas que está utilizando (es decir, tienen ideas diferentes de lo que es Regex válido).
La forma más fácil de solucionar esto (y, sinceramente, también la más segura, ya que se trata de la entrada del usuario) es ajustar toda la lógica de análisis con un intento/captura como este:
// to check if the entered value(val) is a valied regex in string if (re.test(val)) { let convertToRegex; try { convertToRegex = RegexParser(val); setValidRegex(true); // only set this AFTER a successful parse. // also note I've swapped the true / false value here. } catch (e) { setValidRegex(false); } if (convertToRegex) { // TODO: implement filtering logic based on convertToRegex variable } } else { // NOTE: it didn't parse correctly, shouldn't this be false? setValidRegex(false); // I've changed it for you } También creo (?) que ha cometido un par de errores en la forma en que maneja setValidRegex que he corregido en el código. ¡No sea optimista y diga que la entrada del usuario es una expresión regular válida cuando en realidad no ha confirmado (mediante la creación de un RegexParser ) que lo es!
Con este enfoque, existe un argumento para eliminar por re.test(val) y la otra biblioteca, ya que puede obtener lo que desea con solo try/catch -ing. Depende de usted decidir si esta es una opción decente para su base de código.