IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Collection et Stream Java Discussion :

substitution String avec regex, possible ?


Sujet :

Collection et Stream Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut substitution String avec regex, possible ?
    Bonjour à tous,

    Voila je tourne un peu en rond depuis quelques jours. J'ai fait un algo pour faire de la substitution qui me semble pas super optimisé, et j'ai vraiment l'impression de réinventer la roue.

    Voici ce que j'aimerai faire :
    " - - " + "01 01 2007" = 01/01/2007

    J'avais pensé à l'API regex de java.util, qu'en pensez-vous ?

    Merci bcp par avance.

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    J'ai du mal à comprendre ce que tu veux faire exactement !

    a++

  3. #3
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par adiGuba
    Salut,


    J'ai du mal à comprendre ce que tu veux faire exactement !

    a++
    a mon avis, il veut reinventer scanf et printf...
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  4. #4
    Membre éprouvé Avatar de BoudBoulMan
    Profil pro
    Étudiant
    Inscrit en
    Juin 2006
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2006
    Messages : 100
    Par défaut
    Citation Envoyé par kalou
    " - - " + "01 01 2007" = 01/01/2007
    Je ne comprends pas la logique
    Ca devrait pas donner 01-01-2007?

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut
    Oui pardon, en effet :

    " / /" + "01 01 2007" = "01/01/2007"

    Désolé pour le manque d'explication, mais en gros je souhaite remplacer les espaces de la chaine "01 01 2007" par les slashs du template "<espace><expace>/<espace><espace>/". Est-ce plus clair ?

    Merci d'avance.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2007
    Messages : 41
    Par défaut
    Je crois que tu approches le probleme du mauvais angle. Voici des solutions qui pourrait aider.

    Tu sais comment est formatte la date et tu veut remplacer les espaces par des slashs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "01 01 2007".replace(' ','/');
    Tu connais la date et tu veut la formatter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    String.format("%02d/%02d/%04d",1,1,2007);
    Tu sais comment est formatte la date est tu veut la connaitre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    String[] date = "01 01 2007".split(" ");
    int jour = Integer.valueOf(date[0]).intValue();
    int mois = Integer.valueOf(date[1]).intValue();
    int annee = Integer.valueOf(date[2]).intValue();

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut
    Merci pour ces informations.

    Le String.format me semblait pas mal, mais n'est pas implémenté en 1.4.2 ; j'ai comme contrainte java 1.4.2.

    En fait, je souhaite faire quelque chose de générique, pas forcement liè à une date, et donc le template passé comme la chaine à traiter ne sont pas connus d'avance, par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    "  :  " + "01 01" = "01:01"
    "   . " + "100 1" = "100.1"
    "  /  /    " + "01 01 2000" = "01/01/2000"
    Je pensais aussi à System.out.printf ou à System.out.format mais j'avoue que j'ai un peu du mal avec les synthaxes.

    Merci pour votre aide.

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kalou
    Je pensais aussi à System.out.printf ou à System.out.format mais j'avoue que j'ai un peu du mal avec les synthaxes.
    System.out.printf() et System.out.format() utilise la classe Formatter de Java 5.0 tout comme String.format()...


    Pour en revenir à ton problème, je ne pense pas que les regexp soient utiles dans ton cas, parce que tu ne te bases pas sur la chaine en elle même mais sur les positions des caractères...

    Donc une simple boucle de traitement serait amplement suffisante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	public static String transform(String pattern, String value) {
    		StringBuffer buffer = new StringBuffer(value);
     
    		// On parcours les caractères du pattern :
    		for (int i=0; i<pattern.length(); i++) {
    			// Si le pattern comporte autre chose qu'un espace,
    			// et que la chaine comporte un espace, on remplace :
    			if (pattern.charAt(i)!=' ' && buffer.charAt(i)==' ') {
    				buffer.setCharAt(i, pattern.charAt(i));
    			}
    		}
    		return buffer.toString();
    	}
    a++

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut
    Merci bcp pour cet algo, mais il faut que je gère ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    "  /  /" + "1 1 2000" = "1/1/2000"
    "  /  /" + "1 2000" = "/1/2000"
    "  /  /" + "2000" = "//2000"
    "  /  /" + "1 1" = "1/1/"
    "  /  /" + "1" = "/1/"
    Si tu as une idée d'algo je suis preneur, c'est à ce niveau de "complexité" que je voulais m'orienter vers les APIs de Java.

    Merci encore.

  10. #10
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kalou
    Merci bcp pour cet algo, mais il faut que je gère ce genre de chose :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    "  /  /" + "1 1 2000" = "1/1/2000"
    "  /  /" + "1 2000" = "/1/2000"
    "  /  /" + "2000" = "//2000"
    "  /  /" + "1 1" = "1/1/"
    "  /  /" + "1" = "/1/"
    Si tu as une idée d'algo je suis preneur, c'est à ce niveau de "complexité" que je voulais m'orienter vers les APIs de Java.
    Ben il faudrait que tu détailles la logique de ton truc...

    Pourquoi " / /" + "1 2000" donne "/1/2000" et non pas "1/2000/"
    Pourquoi " / /" + "1 1" donne "1/1/" et pas "/1/1" comme dans le cas ci dessus ?


    Et je ne pense pas que tu trouvera quelque chose de tout fait pour cela dans l'API !!!
    C'est bien trop spécifique tu devras le coder toi même...

    a++

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut
    Le plus simple serait que je te montre mon algo et que tu me dise ce que tu en penses :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
     
    String label = "01 1 2000";
    String textTemplate = "  /  /";
    int idxPattern = 0;
    int idxLabel = 0;
    int numberOfBoxes = 10;
     
    while (idxPattern < numberOfBoxes) {
      if ((textTemplate != null) && (textTemplate.length() > idxPattern))
        elm = textTemplate.charAt(idxPattern);
      else
        elm = ' ';
     
      if (elm == ' ') {              	
        char c = ' ';
        try {
          c = label.charAt(idxLabel);	
        } catch (Exception e) { }
     
        if (c != ' ') {
          while (emptyBox > 0) emptyBox--;
          output = output + c;
          idxLabel++;
        } else
          emptyBox++;
     
      } else {
        emptyBox = 0;
        output = output + elm;
        idxLabel++;
      }
     
      idxPattern++;
    }
    Je n'arrive pas à couvrir ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "  /  /" + "2000" = "//2000"
    "  /  /" + "1 1" = "1/1/"

  12. #12
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kalou
    Je n'arrive pas à couvrir ce genre de chose :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    "  /  /" + "2000" = "//2000"
    "  /  /" + "1 1" = "1/1/"
    Encore un fois : je ne comprend pas la logique de la chose : Pourquoi " / /" + "2000" doit donner "//2000" ????

    Sans cela difficile de t'aider...

    a++

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 6
    Par défaut
    Tu as raison, et je pense que la est la limite de l'algo.

    Dans le cas de " / /" + "2000" doit donner "//2000", je voudrais pouvoir identifier le fait qu'on parle bien de l'année avec le "2000", d'ou le souhait de vouloir poser les // pour identifier la chose.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Architecte de système d'information
    Inscrit en
    Mars 2002
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Architecte de système d'information

    Informations forums :
    Inscription : Mars 2002
    Messages : 192
    Par défaut
    Voilà avec des regexp ce que celà peut donner.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    package format;
     
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
     
    public class Formatter {
    	public static void main(String[] args) {
    		System.out.println(format("/", "03"));;
    		System.out.println(format("/", "03 01"));;
    		System.out.println(format("/", "03 2006"));;
    		System.out.println(format("/", "03 01 2007"));;
    		System.out.println(format("/", "2007"));;
    	}
     
    	private static Pattern pDay = Pattern.compile("\\s*(\\d{2})\\s*");
    	private static Pattern pYear = Pattern.compile("\\s*(\\d{4})\\s*");
    	private static Pattern pDayMonthOrYear = Pattern.compile("\\s*(\\d{2})\\s+(\\d{2}|\\d{4})\\s*");
    	private static Pattern pDayMonthYear = Pattern.compile("\\s*(\\d{2})\\s+(\\d{2})\\s+(\\d{4})\\s*");
     
    	private static String format(String sep, String fields) {
    		Matcher m = null;
    		String day = "";
    		String month = "";
    		String year = "";
     
    		m = pDay.matcher(fields);
    		if (m.matches()) {
    			day = m.group(1);
    			return format(day, month, year, sep);
    		}
    		m = pYear.matcher(fields);
    		if (m.matches()) {
    			year = m.group(1);
    			return format(day, month, year, sep);
    		}
    		m = pDayMonthOrYear.matcher(fields);
    		if (m.matches()) {
    			if (m.group(2).length()==2) {
    				day = m.group(1);
    				month = m.group(2);
    			} else {
    				month = m.group(1);
    				year = m.group(2);
    			}
    			return format(day, month, year, sep);
    		}
    		m = pDayMonthYear.matcher(fields);
    		if (m.matches()) {
    			day = m.group(1);
    			month = m.group(2);
    			year = m.group(3);
    			return format(day, month, year, sep);
    		}
     
    		return format("", "", "", sep);
    	}
     
    	private static String format(String day, String month, String year, String sep) {
    		return day + sep + month + sep + year;
    	}
    }
    J'espère que celà aidera.

Discussions similaires

  1. RegEx pour lire une string avec des lignes
    Par Bacube dans le forum VB.NET
    Réponses: 3
    Dernier message: 16/05/2012, 16h20
  2. Filtrer string avec regex
    Par willythe88 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 12/01/2010, 11h08
  3. Problème avec RegEx et une Query string
    Par Erakis dans le forum Langage
    Réponses: 6
    Dernier message: 08/11/2005, 15h48
  4. Réponses: 2
    Dernier message: 29/03/2004, 13h44
  5. string avec Dev-C++ 4
    Par Shadow Blade dans le forum Dev-C++
    Réponses: 15
    Dernier message: 20/03/2003, 18h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo