Pregunta
Basado en esta respuesta
Expresiones regulares: ¿Hay un operador y un operador?
Intenté lo siguiente http://regexpal.com/ pero no pudo hacer que funcionara. ¿Qué me falta? ¿JavaScript no lo admite?
Regex: (?=foo)(?=baz)
Cuerda: foo,bar,baz
Solución
Es imposible para ambos (?=foo)
y (?=baz)
coincidir al mismo tiempo. Requeriría que el próximo personaje sea ambos f
y b
simultáneamente que es imposible.
Quizás quieras esto en su lugar:
(?=.*foo)(?=.*baz)
Esto dice que foo
debe aparecer en cualquier lugar y baz
Debe aparecer en cualquier lugar, no necesariamente en ese orden y posiblemente superpuesto (aunque la superposición no es posible en este caso específico porque las cartas en sí no se superponen).
Otros consejos
Ejemplo de una búsqueda booleana (y) más comodín, que estoy usando dentro de un complemento JavaScript AutoComplete:
Cadena para que coincida: "Mi palabra"
Cadena para buscar: "Estoy buscando mis palabras divertidas dentro de este texto"
Necesita la siguiente regex:/^(?=.*my)(?=.*word).*$/im
Explicando:
^ Afirmar la posición al comienzo de una línea
?= Lookahead positivo
.* coincide con cualquier personaje (excepto Newline)
() Grupos
$ Afirmar la posición al final de una línea
i Modificador: insensible. Matriota insensible al caso (ignora el caso de [A-Za-Z])
metro Modificador: múltiples líneas. Hace que ^ y $ coincidan con el comienzo/final de cada línea (no solo el comienzo/final de la cadena)
Prueba el regex aquí: https://regex101.com/r/is5jj3/1
Entonces, puede crear una función JavaScript que:
- Reemplace los caracteres reservados de regex para evitar errores
- Divida su cuerda en los espacios
- Encapsula tus palabras dentro de los grupos regex
- Crear un patrón regex
- Ejecutar la coincidencia de regex
Ejemplo:
function fullTextCompare(myWords, toMatch){
//Replace regex reserved characters
myWords=myWords.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&');
//Split your string at spaces
arrWords = myWords.split(" ");
//Encapsulate your words inside regex groups
arrWords = $.map( arrWords, function( n ) {
return ["(?=.*"+n+")"];
});
//Create a regex pattern
sRegex = new RegExp("^"+arrWords.join("")+".*$","im");
//Execute the regex match
return(toMatch.match(sRegex)===null?false:true);
}
//Using it:
console.log(
fullTextCompare("my word","I'm searching for my funny words inside this text")
);
//Wildcards:
console.log(
fullTextCompare("y wo","I'm searching for my funny words inside this text")
);
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Tal vez solo un operador |
podría ser suficiente para su problema:
Cuerda: foo,bar,baz
Regex: (foo)|(baz)
Resultado: ["foo", "baz"]
Quizás estés buscando algo como esto. Si desea seleccionar la línea completa cuando contenga "Foo" y "Baz" al mismo tiempo, este Regex cumplirá eso:
.*(foo)+.*(baz)+|.*(baz)+.*(foo)+.*