Estoy tratando de reformatear el formato de Slack a bbcode y necesito un poco de ayuda. Slack hace cursiva como esta:
_this is italic_ and this isn't Mi expresión actual ( /\_([^\_]*)\_/gm ) funciona, pero desafortunadamente recoge guiones bajos en URL y fragmentos de código internos. Slack da formato a URL y código como este:
<www.thislink.com|here's a link> `here's a code snippet`¿Cómo puedo decirle a regex que no coincida con ningún par de guiones bajos dentro de un enlace o fragmento de código? He estado probando la búsqueda negativa hacia adelante y hacia atrás, pero sin éxito.
Debe hacer coincidir y capturar lo que necesita y solo hacer coincidir lo que no necesita.
Una vez que obtenga una coincidencia, analícela e implemente la lógica de código adecuada:
const re = /<[^<>|]*(?:\|[^<>]*)?>|`[^`]*`|_([^_]*)_/g; const text = "<www.thislink.com|here's a link>\n`here's a code snippet`\n_this is italic_ and this isn't"; console.log( text.replace(re, (m,g) => g !== undefined ? "[i]" + g + "[/i]" : m ) )Vea la demostración de expresiones regulares . Detalles :
<[^<>|]*(?:\|[^<>]*)?> - un < , luego cero o más caracteres que no sean < , > y | , luego una secuencia opcional de un | y luego cero o más caracteres que no sean < y > y luego un > carácter| - o`[^`]*` - un acento grave, cero o más caracteres que no sean un acento grave y un acento grave| - o_([^_]*)_ - _ , Grupo 1: cero o más caracteres que no sean _ , un _ .