Otra forma de plantear mi problema es hacer coincidir un carácter siempre que esté precedido por un número par (0, 2, 4, ...) de otro carácter específico.
En mi caso, quiero hacer coincidir todos los caracteres ' en la cadena a menos que esté precedido por un número impar (1, 3, 5 ...) de ?
ejemplo:
- ?' => shouldn't match (preceded by one ?) - ??' => Should match (preceded by 2 ?) - ?????' => Shouldn't match (preceded by 5 ?)Consideremos este escenario:
Tenemos esta cadena: ' ??' ????' ?' ??????' entonces la expresión regular debe coincidir con todos los caracteres ' en este caso, excepto el cuarto, por lo que, por ejemplo, si quiero usar String.split (regex), el resultado sería ['', '??', '????' , ?' '??????']
Actualmente estaba usando esta expresión regular: (?<!\?)' , pero el problema es que solo coincide si no hay ? antes '
Puede usar esta expresión regular con una condición de mirar atrás:
(?<=([^?]|^)(?:\?\?)*)'Explicación RegEx
(?<= : Iniciar la condición de mirar atrás([^?]|^) : Coincide con un no- ? personaje o inicio(?:\?\?)* : Coincide con 0 o más pares de ?) : Fin de la condición de mirar atrás' : Coincide con un 'Puedes usar
/(?<=(?<!\?)(?:\?\?)*)'/gVea la demostración de expresiones regulares . Detalles :
(?<=(?<!\?)(?:\?\?)*) - una mirada positiva hacia atrás que coincide con una ubicación precedida por cero o más apariciones de double ? no precedido inmediatamente por otro ?' - un ' carácter.Código de muestra:
const texts = ["The ?' should not match","The ??' should match","?????' => The ?????' should not match"]; const rx = /(?<=(?<!\?)(?:\?\?)*)'/g for (var text of texts) { console.log(text, '=>', rx.test(text)); }Si necesita reemplazar, es posible con
const texts = ["The ?' should not match","The ??' should match","?????' => The ?????' should not match"]; const rx = /(?<=(?<!\?)(?:\?\?)*)'/g for (var text of texts) { console.log(text, '=>', text.replace(rx, '<MATCH>$&</MATCH>')); }