Estaba tratando de hacer coincidir múltiples patrones de expresiones regulares en una cadena para encontrar el índice de inicio y final.
let str = "I am abinas patra and my email is abinas@gmail.com" let patterns = [ "[az]", "^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}$" ]; let regexObj = new RegExp(patterns.join("|"), "gmi"); let match, indicesArr=[]; while ((match = regexObj.exec(str))) { let obj = { start: match.index, end: regexObj.lastIndex } indicesArr.push(obj); if(!match.index || !regexObj.lastIndex) break; } Obtengo solo 1 objeto en indicesArr que es
[ { "start":0, "end": 1 } ] Quiero que todos los caracteres az coincidan y que el email también coincida. Intenté el enfoque múltiple, no pude encontrarlo. Aquí en la matriz de patterns , el patrón puede ser cualquier expresión regular, solo tomé dos ejemplos.
Usa esto en su lugar:
function extractEmails(text) { return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi); } let str = "I am abinas patra and my email is abinas@gmail.com"; let emailAddress = extractEmails( str ); let remainingString = str.replace( emailAddress, '' ); function extractEmails(text) { return text.match(/([a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z0-9_-]+)/gi); } let str = "I am abinas patra and my email is abinas@gmail.com"; let emailAddress = extractEmails( str ); let remainingString = str.replace( emailAddress, '' ); console.log( "Original string: " + str ); console.log( "Email address: " + emailAddress ); console.log( "Remaining string: " + remainingString );Usando esta línea en el ciclo if(!match.index || !regexObj.lastIndex) break; detendrá el ciclo cuando cualquiera de las declaraciones en la cláusula if sea verdadera.
Si match.index o regexObj.lastIndex es cero, esto será cierto y el ciclo se detendrá, y esto sucederá, por ejemplo, si hay una coincidencia para el primer carácter, ya que el índice será 0.
También puede cambiar el orden de los patrones, poniendo primero el más específico. Debido a que el primer carácter del correo electrónico también coincidirá con [az] , de lo contrario, el correo electrónico no coincidirá.
Tenga en cuenta que debe omitir los anclajes ^ y $ del correo electrónico o, de lo contrario, el correo electrónico solo coincidirá si es la única cadena.
let str = "I am abinas patra and my email is abinas@gmail.com" let patterns = [ "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}", "[az]" ]; let regexObj = new RegExp(patterns.join("|"), "gmi"); let match, indicesArr = []; while ((match = regexObj.exec(str))) { let obj = { start: match.index, end: regexObj.lastIndex } indicesArr.push(obj); } console.log(indicesArr)Probé con for loop para obtener todas las coincidencias con respecto a cualquier orden.
let str = "I am abinas patra and my email is abinas@gmail.com" let patterns = [ "[az]", "[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[AZ]{2,4}" ]; let match, indicesArr = []; for(let i=0;i<patterns.length; i++){ let regexObj = new RegExp(patterns[i], "gmi"); while ((match = regexObj.exec(str)) !== null) { let obj = { start: match.index, end: regexObj.lastIndex } indicesArr.push(obj); } } console.log(indicesArr)