Tengo una nueva extensión de archivo con una sintaxis específica, he creado un archivo de sintaxis sublime y estoy tratando de resaltar ciertos caracteres en el editor de texto sublime.

Asumiendo el siguiente texto:

Accept-Language: en-EN
n1.legend=0,1,meta,text,Legend,b1,30 chars max
r1.label=Contain

Quiero hacer coincidir todos los caracteres después de ":" o "=" excepto la letra "b" seguida de uno o dos números (como un marcador de posición). Intenté la siguiente expresión regular:

(?<=[=|:])((?!b[0-9]{1,2}).)*

Funciona pero no coincide con los caracteres después de "b1" por ejemplo ", 30 caracteres máximo", ¿por qué es eso? alguna ayuda por favor? No soy un experto en expresiones regulares ...

Captura del problema:

Sublime tes syntax file

", 30 caracteres máximo" debe ser amarillo.

1
kapsula 19 abr. 2020 a las 15:04

2 respuestas

La mejor respuesta

Para obtener solo las coincidencias (y si es compatible), puede utilizar \G para obtener coincidencias repetitivas y \K para borrar el búfer de coincidencias.

(?:^[^=:\r\n]+[=:]|\G(?!^))(?:b\d{1,2})?\K.*?(?=b\d{1,2}|$)

Explicación

  • (?: Grupo sin captura
    • ^[^=:\r\n]+[=:] Coincide con el patrón que inicia la cadena
    • | O
    • \G(?!^) Afirma lo positivo en la partida anterior, no en el inicio
  • ) Cerrar grupo
  • (?:b\d{1,2})? Opcionalmente coincide con b seguido de 2 dígitos
  • \K Restablecer el búfer de coincidencias
  • .*? Coincide con cualquier personaje excepto una nueva línea lo menos posible (no codicioso)
  • (?=b\d{1,2}|$) Búsqueda anticipada positiva, afirme que lo que está a la derecha es b seguido de 2 dígitos o el final de la cadena

Demostración de Regex

3
The fourth bird 19 abr. 2020 a las 14:43

Si desde la línea 0,1,meta,text,Legend,1,30 chars max desea hacer coincidir 0,1,meta,text,Legend,,30 chars max, la siguiente expresión regular debe satisfacer sus necesidades:

=(.*)b\d{1,2}(.*)

Concatenar el primer y el segundo grupo de coincidencias (reemplazar la cadena $1$2) te da tu coincidencia.

Demo de RegExr

0
simon-pearson 19 abr. 2020 a las 13:02