2
votes

Regex Java. Comment obtenir 3 parties de texte différentes?

J'ai cette très longue chaîne en java

200/23 / Ne7WoRK / 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18> a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36eb58b4a5308750e63e4690c4538ddc18> a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32c62c4b441906833563d32c62c4b441906833563d32c62c4b441906833563d32c62c4f3

Ce que je veux, c'est obtenir:

Enchère: 200

Nom d'utilisateur: Ne7WoRK

Signature: 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a03cf331c564715f

J'ai besoin de 3 expressions régulières qui m'aideront à obtenir des chaînes distinctes de la valeur de l'enchère, du nom d'utilisateur et de la signature. Je ne sais pas comment y parvenir. J'ai tenté de résoudre ce problème avec l'expression régulière suivante

\ b. * / \ b

Cependant, cette expression régulière correspond aux 3 sous-parties entières et en donne une sortie

200/23 / Ne7WoRK /

Je ne sais pas comment créer 3 expressions régulières différentes où:

  1. Le premier correspondra à tous les chiffres du début de la chaîne jusqu'au premier symbole "/". Donner une chaîne de 200
  2. Le second correspondra à n'importe quel caractère du deuxième symbole "/" jusqu'au troisième symbole "/". Donner Ne7WoRK
  3. Le troisième doit correspondre à tout, du troisième "/" à la fin de la chaîne. Donnant le nombre long de - 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a056ecf331

1 commentaires

Vous ne devriez pas poser de questions sur les expressions régulières si vous ne savez pas encore si elles sont le meilleur outil pour le travail. Dans ce cas, ils ne le sont pas, car un simple String.split suffit.


4 Réponses :


1
votes

Essayez ceci: (\d+)\/(?:.+)\/(.+)\/(.+)

Cela vous donnera 3 groupes contenant les 3 strings.

Le code Java pour cela serait:

Matcher matcher = Pattern.compile("(\d+)\/(?:.+)\/(.+)\/(.+)").matcher(yourString);
if (matcher.find()) {
    String bid = matcher.group(1);
    String username = matcher.group(2);
    String signature = matcher.group(3);
} else {
    // Malformed String
}


1 commentaires

Vous devriez utiliser matcher.match () au lieu de matcher.find () , pour attraper plus de chaînes invalides.



5
votes

vous pouvez le diviser

[200, 23, Ne7WoRK, 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e]

Résultat

String a = "200/23/Ne7WoRK/3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e";
System.out.println(Arrays.toString(a.split("/")));

Et ensuite faire un autre travail pour obtenir l'exigence souhaitée


0 commentaires

0
votes

Vous pouvez regrouper les expressions en utilisant () par exemple, vous auriez 3 regroupements.

^([\d]*)\/([\d]*)\/([a-zA-Z|0-9]*)
  • Groupe 1: chiffres
  • Groupe 2: chiffres
  • Groupe 3: Alpha et chiffres


0 commentaires

0
votes

Vous pouvez diviser en faisant correspondre soit une barre oblique, plus de 1 chiffres et une barre oblique ou simplement une barre oblique en utilisant un alternance :

[200, Ne7WoRK, 3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e]

Démo Regex | Démo Java

Par exemple:

String regex = "/\\d+/|/";
String string = "200/23/Ne7WoRK/3045022100d62568e28cb58b4a5308750e63e4690c4538ddc18>a9dc6075d02f7b4f942c4aa0220587350e7db1f4380a36ebb441906833563d32a62c4a>03cf334295615f981c47e";
System.out.println(Arrays.toString(string.split(regex)));

Résultat :

/\d+/|/


0 commentaires