2017-10-03 4 views
0

Voici ce que je suis:Quel est le problème avec mon expression régulière?

grep -E '^([0-9]+[0-9]*[.]+[:blank:]+[a-zA-Z0-9]+)' text.txt 

Je suis en train de trouver tous les matchs qui ont un ou plusieurs chiffres suivis d'un « » point, atlas un espace et suivi par au moins un caractère ou un nombre, au début. Donc, quelques correspondances possibles seraient,

1. hello 
2. this works too 
5. Fantastic show 
12. Target 

Qu'est-ce qui ne va pas avec ce que j'ai.

+0

Ce site pourrait vous aider avec votre regex https://regexr.com/ – Kixoka

+0

@ctwheels, pas (portably) avec 'grep' vous ne pouvez pas.Ce que vous fournissez ci-dessus a la syntaxe PCRE pas garanti d'être présent dans ERE sans extensions spécifiques à la plate-forme. La spécification ERE n'inclut pas '\ d', * ou *' \ s', * ou * '\ w'. –

+0

@CharlesDuffy merci de le signaler. Je vais supprimer mon commentaire précédent afin de ne pas créer de confusion supplémentaire pour les utilisateurs de syntaxe non-PCRE. La regex peut encore être simplifiée, puisque le premier jeton est gourmand, donc le second jeton est vraiment redondant. – ctwheels

Répondre

0

Vous n'incluez pas d'espaces dans l'expression de correspondance post-numéro:

[a-zA-Z0-9]+.

Vous pouvez également simplifier votre expression.

  • [0-9]+[0-9]* devrait juste être [0-9]+, ou plus simplement \d+. Votre expression d'origine signifie "correspondre à un ou plusieurs chiffres, puis zéro ou plusieurs chiffres". Un ou plusieurs gère déjà votre entrée attendue.

  • [.]+ - Vous attendez plus d'une période? Sinon, vous ne souhaitez que [.]

Étant donné que, je changerais votre expression:

^([0-9]+[.][[:blank:]]+[a-zA-Z0-9 ]+) 

(modifications au posix [[:blank:]] grâce à @randomir).

0

En ce qui concerne la validité, deux choses:

  • [:blank:] est une classe de caractères. Pour l'utiliser dans une plage que vous devez l'envelopper avec [ ], comme ceci: [[:blank:]]

  • votre dernière expression de gamme ne comprend pas d'espaces, de sorte que vous correspondez seul le premier mot

fixe, ressemble :

$ grep -E '^([0-9]+[0-9]*[.]+[[:blank:]]+[a-zA-Z0-9 ]+)' text.txt 
1. hello 
2. this works too 
5. Fantastic show 
12. Target 

Sinon, comme d'autres l'ont laissé entendre, votre expression peut être simplifiée. Si vous devez coller aux expressions régulières étendues POSIX (ERE), notez que [0-9]+[0-9]* est équivalent à [0-9]+.

Si vous pouvez activer le support PCRE (avec -P, disponible uniquement dans GNU grep, considéré comme fonctionnalité expérimentale), vous pouvez simplifier les gammes de caractères utilisés. Par exemple, vous pouvez utiliser \d au lieu de POSIX [[:digit:]] (ou [0-9]), et \w au lieu de [[:alnum:]] (ou [a-zA-Z0-9]):

$ grep -P '^\d+\.+\s+[\w ]+' text.txt 
+0

Seulement si vous utilisez PCRE. En outre, peut-être OP veut que plusieurs points correspondent, il n'a pas précisé. – randomir

+0

En regardant le contexte de l'entrée et la remarque 'follow by a". " dot', je crois que c'est un seul point, mais le PO peut être en mesure de mieux clarifier. Sans tenir compte de PCRE ou non, vous pouvez simplifier '[0-9] + [0-9] *' à '[0-9] +' au moins. La seconde est vraiment redondante et ne sera jamais mise en correspondance puisque le premier jeton est gourmand. – ctwheels

+0

Vous avez raison à propos de cette partie, '[0-9] + [0-9] *' est équivalent à '[0-9] +'. – randomir