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