Capturar apenas o número do pedido com regex

Eu tenho uma regex onde pega o número do pedido, onde precisa começa com o número 4 e ter mais 9 dígitos e não pode ter número de pedido repetido, mas caso tiver algum número antes do 4 não pode pegar

 regex:
 ([4][0-9]{9}\b)(?!.*1)

Explicação:

(        - primeiro grupo de captura
[4][0-9]{9} -10 digitos, sendo o primeiro digito 4 seguido com 9 digitos de 0 a 9
\b       - ancora
)        - fecha o grupo de captura
(?!      - Negative lookahead, que não tenha à frente
.*       - qualquer coisa
\1)      - seguida do que foi capturado no grupo 1

Exemplo:

12534254687815 ← dessa forma ele não poder.

Se vier dessa forma preciso pegar

PO4254687815

Basta incluir um lookahead negativo verificando se antes do 4 não tem um número:

((?<!\d)4[0-9]{9}\b)(?!.*\1)

Repare também que para o 4 não precisa dos colchetes ([4] e 4 é a mesma coisa - de forma geral, se só tem um único caractere entre os colchetes, eles não são necessários).

4 curtidas

Nossa me ajudou bastante, muito obrigada, era isto mesmo que estava faltando. Obrigada!

Uma dúvida, às vezes parece que a parte final para não colocar duplicado, mas mesmo assim pegar valor duplicado.

DISCRIMINAÇÃO DOS SERVIÇOS
00000001 - REFERENTE AOS SERVICOS PRESTADOS NO PERIODO DE 2022-08-16 A 2022-09-15 - NRo. PEDIDO DE COMPRA:
4254687815 - NRo.  Compra 4254687815

Ele está pegando os dois valores iguais.

Como assim? Nesse caso ele só pega uma das ocorrências, veja.

A regex significa “O dígito 4 seguido de 9 dígitos, desde que essa mesma sequência não se repita à frente”.

Na linha 4254687815 - NRo. Compra 4254687815, a regex não pega o primeiro, porque depois o mesmo número se repete. Mas ela pega o segundo, porque depois dele o número não se repete.


Se for para pegar o número somente se ele ocorre apenas uma vez na linha, aí é mais fácil tratar fora da regex. Como o tópico tem a tag Java, então o código seria assim:

String texto = "4254687815 - NRo.  Compra 4254687815";
Matcher m = Pattern.compile("(?<!\\d)4[0-9]{9}\\b").matcher(texto);
// pega a primeira ocorrência
String pedido = null;
if (m.find()) {
    pedido = m.group();
}
// verifica se tem mais ocorrências
boolean repete = false;
while (m.find()) {
    if (pedido.equals(m.group())) {
        repete = true;
        break; // se já repetiu, não precisa continuar
    }
}
if (repete) {
    // pedido se repete, inválido (mostra mensagem de erro, etc)
    System.out.println("pedido se repete");
} else {
    // pedido só ocorre uma vez, (ou nenhuma)
    if (pedido == null) {
        System.out.println("Pedido não encontrado");
    } else {
        System.out.println("pedido=" + pedido);
    }
}
1 curtida

Obrigada novamente!!!