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

¿Fue útil?

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:

  1. Reemplace los caracteres reservados de regex para evitar errores
  2. Divida su cuerda en los espacios
  3. Encapsula tus palabras dentro de los grupos regex
  4. Crear un patrón regex
  5. 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)+.*

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