Matcher e Pattern (Matches) [RESOLVIDO]

18 respostas
D

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

18 Respostas

R

Acho melhor você explicar melhor seu problema, porque do jeito que me parece, seu primeiro padrão vai casar com muitos casos.

D

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 ? :slight_smile:

R

Ah sim, agora sim. E qual sua dúvida?

D

Rodrigo Sasaki,

Onde * ( qual string )
Onde ? ( um unico caracter )

R

dugbuddy:
Rodrigo Sasaki,

Onde * ( qual string )
Onde ? ( um unico caracter )


Seu problema então está em entender as expressões regulares?

D

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

R

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.
D

Rodrigo Sasaki,

Eu tinha pensado nessa possibilidade

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");
					}
R

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

D

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

R

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.

E

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 ("\\?", ".?"));
...
R

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 ("\\?", ".?")); ...


Mas aí o guloso do .* já a caba com a graça de todo mundo :slight_smile:

D

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

R

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


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

D

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?

R

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

D

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 !

Criado 22 de abril de 2013
Ultima resposta 23 de abr. de 2013
Respostas 18
Participantes 3