2009-12-19 5 views
1

je dois être en mesure d'analyser des chaînes comme celles-ci:aide Regex avec chaîne de division

kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three 

-+gdl+-kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three 

kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three-+gdl+- 

et dans les trois cas reconnaissent ces trois groupes:

kev-+kvs+-one 

greg-+kvs+-two 

les-+kvs+-three 

En d'autres termes, il doit utiliser la chaîne - + gdl + - pour diviser la chaîne.

On suppose que la séquence - + + - GDL ne se produira pas, sauf comme séparateur.

Comment pourrais-je écrire regex pour cela?

+2

"Certaines personnes, lorsqu'elles sont confrontées à un problème, pensent" je sais, j'utiliserai des expressions régulières ". Maintenant, ils ont deux problèmes." - Jamie Zawinski –

+0

Je suis conscient que je peux diviser ceci - je me demandais s'il était possible de le faire en utilisant des expressions régulières. Votre commentaire semble indiquer le contraire. –

+7

* 'Et certaines personnes, confrontées à des expressions régulières, pensent "je sais, je vais utiliser une citation accrocheuse dont je me souviens". Maintenant, ils n'ont rien ajouté à la discussion. '* --Tomalak –

Répondre

0

Vous pouvez résoudre avec une expression régulière, juste u se -+gdl+- comme le motif de la scission. Ce qui doit être échappé dépend de la saveur de votre regex.

EDIT après votre commentaire: vous pouvez le faire avec un match mais il ajoute une complexité inutile. Elle dépend aussi de la langue, par exemple en PHP

preg_match_all('/(.*?)(?:-\+gdl\+-|$)/', $string, $match); 

vous obtiendrez matchs vides cependant.

+0

Merci, kemp. Je ne savais pas que $ pouvait être considéré comme faisant partie d'une expression régulière. –

-1
.*?\-\+gdl\+\-.*? 
+0

Pourquoi échappez-vous au '-', et pourquoi avez-vous inclus le'. *? 'Dans votre regex? –

0

La plupart des bibliothèques ont regex fonction split. Vous appelez simplement cette fonction avec l'argument + gdl + et il vous renvoie un tableau. Les détails varient d'une langue à l'autre.

Cependant, vous ne même pas besoin regex. Beaucoup de bibliothèques de langues auront une fonction à partager sur "+ gdl +". Quelle langue utilisez-vous?

+0

Comme je l'ai dit dans mon commentaire ci-dessus à Andreas, je suis conscient que je peux diviser cela. Je voulais savoir s'il était possible de faire avec regex. Êtes-vous en train de dire que ce n'est pas possible? –

1

Vous ne devez pas écrire un regexp pour que juste une rupture avec la chaîne que vous voulez comme séparateur, et vous obtiendrez le champ (s) voulu.

Un exemple, mais je ne sais pas ce que la langue que vous utilisez

"kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three".split("-+gdl+-") 
+0

Dans certaines langues, la seule méthode split (...), prend une regex (pas une chaîne de caractères). Prenez Java par exemple. –

+0

Une chaîne ordinaire est une regex qui n'a pas de métacaractères –

+0

Soupir ... (15 chars de remplissage) –

1

En bref, l'expression régulière dont vous avez besoin est la suivante:

-\+gdl\+- 

Le code Java suivant peut le faire, l'impression de la nombre de jetons et les jetons eux-mêmes:

import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class Regex { 
    public static void main(String[] args) { 
     String text = "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three"; 
     String regex = "-\\+gdl\\+-"; 
     Pattern p = Pattern.compile(regex); 
     String[] tokens = p.split(text); 
     System.out.println("Found " + tokens.length + " tokens"); 
     for (String token: tokens) { 
      System.out.println("Found " + token); 
     } 
    } 
} 
+3

Un peu verbeux cependant, les trois lignes 'String regex =" - \\ + gdl \\ + - "; Modèle p = Pattern.compile (regex); String [] tokens = p.split (texte); 'pourrait simplement être écrit comme:' String [] tokens = text.split ("- \\ + gdl \\ + -"); ' –

0

Je ne suis pas sûr de ce que la langue que vous cherchez, mais Ruby vous pouvez simplement utiliser [String#split] 1 (et vous n'avez pas besoin regexp, un paramètre de chaîne simple fera):

>> strings = ["kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three", 
       "-+gdl+-kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three", 
       "kev-+kvs+-one-+gdl+-greg-+kvs+-two-+gdl+-les-+kvs+-three-+gdl+-"] 
>> split = strings.map {|s| s.split "-+gdl+-"} 
=> [["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["", "kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"]] 

Notez que cela pose le problème de l'introduction de champs null au début ou au milieu de votre chaîne. Si vous ne voulez pas de champs null, vous aurez probablement de filtrer les après coup:

>> split.map {|a| a.reject {|s| s == ""}} 
=> [["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"], 
    ["kev-+kvs+-one", "greg-+kvs+-two", "les-+kvs+-three"]] 

Si vous n'êtes pas familier avec le rubis, la partie map applique simplement la même chose à chaque élément le tableau, donc je peux démontrer comment cela s'applique à tous nos exemples.

0

Je ne suis pas sûr de ce langage de programmation que vous utilisez.Si vous utilisez des langages de programmation de haut niveau tels que java, python est assez facile, comme la plupart d'entre eux l'ont spécifié, vous trouverez une fonction split.

Si vous utilisez la ligne de commande comme invite bash, j'utiliser sed

$ str = "kev- + KVS + -one- + GDL + -Greg- + KVS + -two- + GDL .. . "

$ pour i dans` `echo $ str | sed 's/- + gdl + -// g' ; fais écho $ i; fait

kev- + KVS + one

greg- + KVS + -Deux

+ KVS + les- -trois

kev- + KVS + one

greg- + KVS + - deux

les- + KVS + -threekev- + KVS + -one

greg- + KVS + -deux

+ KVS + les- -trois

Ou en Perl vous pouvez faire un peu différemment

$ echo $ str | perl -pe 's /(.*?)-+ gdl + -/$ 1 \ n/g'