2009-07-17 4 views
1

Désolé, c'est probablement très simple. Mais si vous avez un caractère délimiteur sur chaque ligne et que vous voulez trouver tout le texte avant le délimiteur sur chaque ligne, quelle expression régulière ferait cela? Je ne sais pas si le délimiteur est important mais le délimiteur que j'ai est le caractère%.Comment trouvez-vous tout le texte jusqu'au premier caractère x sur une ligne?

+0

Avez-vous d'autres critères sur le texte ou voulez-vous simplement tout saisir devant le%? –

+2

Dans quelle langue est votre projet? Regex _might_ ne pas être le meilleur moyen de le faire. – beggs

+1

Ce n'est vraiment pas un problème regex ... vous pouvez * les utiliser, mais très inutile. – Tom

Répondre

1

Votre texte sera dans le groupe 1.

/^(.*?)%/ 

Note: Cette capture tout le signe pour cent. Si vous voulez limiter ce que vous capturez, remplacez le. avec le escape sequence de votre choix.

+1

Comme je l'ai mentionné, regex est inutile pour ce problème, mais au moins c'est le bon :-). – Tom

+0

Je suis d'accord, juste pour répondre à la question :-) La plupart des langues auront quelque chose de beaucoup plus simple pour des tâches aussi simples. –

+0

... comme votre réponse le montre clairement. –

0

vous n'avez pas besoin d'utiliser regex si vous ne le souhaitez pas. Selon la langue que vous utilisez, il y aura une sorte de fonction de chaîne comme split().

$str = "sometext%some_other_text"; 
$s = explode("%",$str,2); 
print $s[0]; 

Ceci est en PHP, il se divise sur%, puis obtient le premier élément du tableau retourné. De même, dans d'autres langues, avec des méthodes de fractionnement.

+0

Bien que ce ne serait probablement pas un gros problème, je vais le mentionner à nouveau, donc c'est sur ce post. "exploser" est un peu inutile car il faut regarder toute la chaîne.Il construit également une liste (et un objet chaîne supplémentaire). La sous-chaîne est conceptuellement plus simple et plus rapide car elle ne nécessite pas de regarder toute la chaîne. (Trouver la première occurrence d'un délimiteur ne nécessite pas de regarder toute la chaîne). – Tom

+0

Et si la sous-chaîne que vous recherchez est proche de la fin? cela regarde la chaîne entière aussi. "substringing" implique 2 étapes, l'une, la recherche de l'index, la seconde, la sous-chaîne. Les deux impliquent l'appel à 2 fonctions. Est-ce plus rapide que d'appeler des éléments en mémoire (par exemple array)? Avez-vous un moyen de comparer ces deux méthodes pour me convaincre de ce que vous dites est vrai? :) – ghostdog74

0

En python, vous pouvez utiliser:

def GetStuffBeforeDelimeter(str, delim): 
    return str[:str.find(delim)] 

En Java:

public String getStuffBeforeDelimiter(String str, String delim) { 
    return str.substring(0, str.indexOf(delim)); 
} 

En C++ (non testé):

using namespace std; 
string GetStuffBeforeDelimiter(const string& str, const string& delim) { 
    return str.substr(0, str.find(delim)); 
} 

Dans tous les exemples ci-dessus, vous voulez manipuler des cas d'angle, tels que votre chaîne ne contenant pas le délimiteur.

Fondamentalement, je voudrais utiliser la sous-chaîne pour quelque chose d'aussi simple, car vous pouvez éviter de balayer toute la chaîne. Regex est surpuissance, et "exploser" ou diviser sur le délimiteur est également inutile, car il regarde toute la chaîne.

+0

bien sûr, je laisse la manipulation des erreurs comme un exercice pour le lecteur, mais c'est l'idée :-). – Tom

+0

sous-chaîne regarde toute la chaîne trop à droite? vous devez utiliser find() (en python) ou indexOf (en java) pour trouver l'index. – ghostdog74

+0

@ ghostdob74: la sous-chaîne n'a pas besoin de regarder toute la chaîne. Il peut juste regarder la partie que vous sous-chaîne. De plus, l'indexOf ou find doit seulement balayer jusqu'à la première occurrence du délimiteur, puis s'arrêter ... il ne balaie pas jusqu'à la fin à moins que le délimiteur soit à la fin ou pas dans la chaîne. – Tom

0

Vous ne dites pas quelle est la saveur de regex, donc je vais utiliser la notation Perl.

/^[^%]*/m 

La première ^ est un début anchor: normalement il correspond seulement au début de la chaîne entière, mais cette expression rationnelle est en mode multilignes remercie le « m » modifier à la fin. [^%] est un character class inversé: il correspond à n'importe quel caractère sauf '%'. Le * est un quantifier qui signifie pour correspondre à la chose précédente ([^%] dans ce cas) zéro ou plusieurs fois.

Questions connexes