Olá,
Gostaria de uma ajuda com esta situação.
Eu tenho um part number ( string ) e tenho que fazer uma busca por mask.
i.e
Eu tenho um part number ( MCAB9090-WE123 ) e preciso percorrer uma lista de mascaras e saber qual se encaixa.
MCA*
MCA?9090-??123
MCA*-??123
Obrigado
Acho melhor você explicar melhor seu problema, porque do jeito que me parece, seu primeiro padrão vai casar com muitos casos.
Rodrigo Sasaki,
Eu tenho que preencher uma lista com alguns valores de acordo com o Part Number
mask | name
MCA* | test1
MCA?9090-??123 | test2
MCA*-??123 | test3
Eu vou pegar esse part number e ver qual se encaixa nas mascaras e preencher uma lista.
i.e
Lista = test1,test3
Consegui explicar ? 
Ah sim, agora sim. E qual sua dúvida?
Rodrigo Sasaki,
Onde * ( qual string )
Onde ? ( um unico caracter )
[quote=dugbuddy]Rodrigo Sasaki,
Onde * ( qual string )
Onde ? ( um unico caracter )[/quote]
Seu problema então está em entender as expressões regulares?
Eu preciso achar uma expressao regular para este problema e nao sei como .
Pattern pat = Pattern.compile( ?????? );
Matcher mat = pat.matcher(partNumber);
if (mat.find()) {
list.add(name);
}
mais ou menos assim
Se você tiver exemplos mais concretos eu posso te ajudar.
- Qual os padrões que serão utilizados?
- Exemplos de Strings que serão enviadas como argumento para essa função.
Rodrigo Sasaki,
Eu tinha pensado nessa possibilidade
[code]
String partNumber = “MCADT71-AB123”;
String pnSplited = “MCA*-??123”;
String pn1 = pnSplited.replace("?", “[a-zA-Z0-9]”);
String pn2 = pn1.replace("*", “[\w]”); ( mas eu nao sei usar expresao regular para * … ) ??
if (partNumber.matches(pn2)) {
System.out.println(“OK”);
}[/code]
Tá, ficaram umas dúvidas conceituais aí. o método replace não trabalha com expressões regulares. O método replaceAll sim.
Vamos pra uns exemplos.
Quero substituir todos os números da String pela letra “n”:str.replaceAll("\\d", "n");
Quero substituir todas as vírgulas por pontos:str.replaceAll(",", ".");
Quero remover todos os caracteres que não são ASCII:str.replaceAll("[^\\p{ASCII}]", "")
Na esquerda eu coloco a expressão que quero encontrar, e na direita a String literal pela qual irei substituir o que encontrei
Rodrigo Sasaki,
Se eu quiser substituir o ( * ) por qualquer palavra.
Existe isso?
eu tenho essa situação
Part Number = MCA*-??123
onde * pode ser qualquer palavra e ? pode ser 1 unico caracter
Este partNumber poderia ser assim MCA2A3D4F-CC123
Como ficaria o ReplaceAll?
obrigado
Se você quiser substituir qualquer palavra tem que ser algo diferente. Não tem o “qualquer palavra” tem que dizer qual palavra que é.
e o * é um quantificador, não é válido em expressões regulares, o que você quer é algo como .* provavelmente. Mas isso substituiria tudo na sua String.
Você pode converter uma máscara no formato wildcard (no seu caso, “*” e “?” ) para um Pattern.
De modo geral, “" equivale a ".” e “?” equivale a “.?”.
Por exemplo:
String mascara = "MCA*-??123";
Pattern pat = Pattern.compile (mascara.replaceAll ("\\*", ".*").replaceAll ("\\?", ".?"));
...
[quote=entanglement]Você pode converter uma máscara no formato wildcard (no seu caso, “*” e “?” ) para um Pattern.
De modo geral, “" equivale a ".” e “?” equivale a “.?”.
Por exemplo:
String mascara = "MCA*-??123";
Pattern pat = Pattern.compile (mascara.replaceAll ("\\*", ".*").replaceAll ("\\?", ".?"));
...
[/quote]
Mas aí o guloso do .* já a caba com a graça de todo mundo 
Rodrigo,
O problema é este, essas mascaras serão criadas pelo cliente e eles usam * ( qualquer sequencia ) e ? para um caracter.
Eu nao estou conseguindo criar uma expressa regular para fazer esse match,
Teria alguma outra possibilidade sem usar o match ou find ?
muito obrigado pela ajuda
[quote=dugbuddy]Rodrigo,
O problema é este, essas mascaras serão criadas pelo cliente e eles usam * ( qualquer sequencia ) e ? para um caracter.
Eu nao estou conseguindo criar uma expressa regular para fazer esse match,
Teria alguma outra possibilidade sem usar o match ou find ?
muito obrigado pela ajuda[/quote]
Tem que ver melhor o que você quer dizer como sequencia, porque o .* vai ler sua String inteirinha, a única coisa que ele ignora (e nem sempre) são quebras de linha. O ideal seria utilizar a ideia do entanglement mas substituir o * por .*? ou talvez \b.*?\b
Eu sou ruim pra explicar por msg… hahaha
Mas assim.
O User colocar um part number MCA9090-BA123 para carregar uma lista de nomes.
Eu tenho que pegar esse part number e percorrer uma lista de mascaras para popular uma lista.
Mask | name
MCA* | name1
MC?9090-??123 | name2
MCA*-??123 | name3
De acordo com o part number acima, a lista vai ser essa, pois essas
Lista = name1,name2,name3;
COrreto?
O problema é que essas máscaras não estão em nenhum padrão que o Java reconhece.
Você precisa pegar elas e converter parar um Pattern, para aí sim, aplicar elas ao tal do part number
Rodrigo,
Eu fiz assim.
public static void main(String[] args) {
String partNumber = "MSI24172-001";
List<String> list = new ArrayList<String>();
list.add("MSI?41?2-0?1");
list.add("MSI24172*");
for (String mask : list) {
String pn1 = mask.replace("?", "[a-zA-Z0-9]");
String pn2 = pn1.replace("*", "[A-Za-z0-9\\-]*");
Pattern pat = Pattern.compile(pn2);
Matcher mat = pat.matcher(partNumber.trim());
if (mat.matches()) {
System.out.println("OK");
}
}
}
Muito obrigado pela ajuda!
valew galera !