(\+?[0-9]{3,15})?
vamos por partes
[0-9] é uma e.r. que representa qualquer dígito de 0 até 9
[0-9]{3,15} é a mesma coisa, entretanto é esperado um grupo de no mínimo 3 e no máximo 15 dígitos.
\+? é equivalente à +? pois:
- o caracter + é um caracter reservado que significa que uma ER se aplica no mínimo uma vez
- neste exemplo vc quer o caracter literal +, pro isso vc o protege com uma barra invertida na frente.
- no java, as strings como a que representa uma ER precisa de 2 \ para representar uma \
- um ? representa ‘opcional’, no caso este numero pode ser precedido de + ou não.
por fim, o (ER)? é algo meio estranho. os parêntesis significam um grupo - exceto quando são escapados para representar o caracter literal ( ou ), essa ER representa um numero de 3 à 15 digitos, com ou sem o sinal de + na frente OU não representa nada.
Faça alguns exemplos de números e veja se eles são encontrados por esta expressão regular, melhor forma de aprender é praticando.
Vc disse que quer validar um número fiscal de 9 digitos. Vc precisa ser mais específica.
Estes números representam números fiscais em portugal?
123.456.789
123456789 -> [0-9]{9}
012.345.678
12345678