Busqué una solución y jugué un poco con algunos ejemplos, pero no pude encontrar lo que estaba buscando. (estoy usando javascript)
Básicamente, solo debe coincidir con una cadena de 18 dígitos si el primer carácter no es @ , solo debe incluir los 18 dígitos.
Así que algo como /[^@]\d{18}/g pero si hago esto incluye el primer carácter que no es un @
Ejemplos: test 123456789012345678 abc match 123456789012345678
test @123456789012345678 abc no coincide.
Una opción es hacer coincidir una @ y un dígito que no desea, y luego capturar 18 dígitos entre los límites de las palabras \b en el grupo de captura 1 que desea conservar.
Los límites de las palabras son para evitar una coincidencia parcial de los dígitos.
@\d|\b(\d{18})\bDemostración de expresiones regulares
Si es compatible, también puede usar una mirada negativa hacia atrás:
\b(?<!@)\d{18}\b