web-dev-qa-db-fra.com

Regex: correspondant à la première occurrence d'un caractère

Je cherche un modèle qui correspond à tout jusqu'à la première occurrence d'un caractère spécifique, disons un ";" - un point-virgule.

J'ai écrit ceci:

/^(.*);/

Mais cela correspond en fait à tout (y compris le point-virgule) jusqu'à la dernière occurrence d'un point-virgule.

295
Leon Fedotov

Vous avez besoin

/[^;]*/

Le [^;] est une classe de caractères , elle correspond à tout sauf à un point-virgule.

Pour citer la page de manuel perlre :

Vous pouvez spécifier une classe de caractères en incluant une liste de caractères entre [], qui correspondra à n’importe quel caractère de la liste. Si le premier caractère après le "[" est "^", la classe correspond à tout caractère ne figurant pas dans la liste.

Cela devrait fonctionner dans la plupart des dialectes d'expression régulière.

433
sleske

Aurait;

/^(.*?);/

travail?

Le ? est un opérateur paresseux. Ainsi, l'expression rationnelle enregistre le moins possible avant d'apparier le ;.

257
RJFalconer

/^[^;]*/

Le [^;] dit correspond à tout sauf un point-virgule. Les crochets sont un opérateur de correspondance, c’est essentiellement, correspond à n’importe quel caractère de cette série de caractères, le ^ au début en fait une correspondance inverse, donc correspond à tout pas dans cet ensemble.

33
Glenn Slaven

Essayez /[^;]*/

Google regex character classes pour plus de détails.

15
Dan Breslau

Essayez /[^;]*/

C'est une négation classe de personnage .

10
Skilldrick

exemple de texte:

"this is a test sentence; to prove this regex; that is g;iven below"

Si, par exemple, nous avons l'exemple de texte ci-dessus, l'expression rationnelle /(.*?\;)/ vous donnera tout jusqu'à la première occurrence de point-virgule (;), y compris le point-virgule: "this is a test sentence;"

7
poncius

ce n'est pas une solution regex, mais quelque chose d'assez simple pour la description de votre problème. Il suffit de scinder votre chaîne et d’obtenir le premier élément de votre tableau.

$str = "match everything until first ; blah ; blah end ";
$s = explode(";",$str,2);
print $s[0];

sortie

$ php test.php
match everything until first
5
ghostdog74

Cela m'a été très utile car j'essayais de comprendre comment faire correspondre tous les caractères d'une balise XML, y compris ses attributs. Je courais dans le problème "correspond à tout jusqu'à la fin" avec:

/<simpleChoice.*>/

mais a pu résoudre le problème avec:

/<simpleChoice[^>]*>/

après avoir lu ce post. Merci a tous.

4
Yardboy

"/^([^\/]*)\/$/" a travaillé pour moi pour obtenir uniquement les meilleurs "dossiers" d'un tableau tel que:

a/   <- this
a/b/
c/   <- this
c/d/
/d/e/
f/   <- this
3
sPooKee

Cela correspondra à la première occurrence uniquement dans chaque chaîne et ignorera les occurrences suivantes.

/^([^;]*);*/
3
mchid

Vraiment un peu triste que personne ne vous ait donné la bonne réponse ....

En regex,? le rend non gourmand. Par défaut, l'expression régulière correspondra autant que possible (gourmand)

Ajoutez simplement un? et ce sera non-gourmand et correspondra le moins possible!

Bonne chance, espérons que cela aide.

2
L1amm