2017-01-26 4 views
2

je les lignes suivantes, plus ou moins:fin de capture de chaîne de ligne mais il faut éviter la capture des caractères arrière correspondants

$strings = [ 
    "Concepto de la transferencia Un concepto uno  ", 
    "Concepto traspaso Orden #121231", 
    "Concepto trasnferencia  121231 Magical Concept  ", 
] 

et ont la regex suivante:

|Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)$| 

qui capture bien le final une partie de chacune de ces chaînes:

"Un concepto uno  " 
    "Orden #121231" 
    "121231 Magical Concept  " 

(espaces de fin inclus). Mais je voudrais que le match à exclut les espaces de fin, quand ils existent. Résultat:

"Un concepto uno" 
    "Orden #121231" 
    "121231 Magical Concept" 

J'ai essayé:

Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)(?>\s+)?$ 

ou

Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+)\s*$ 

Mais ni travail, évidemment. Impossible de créer des modificateurs en ligne E.g. (U) fonctionne pour le groupe concepto.

Et je sais que je ne peux pas juste trim la correspondance qui en résulte et être fait avec elle. Je veux juste faire fonctionner cette regex. :)

Répondre

5

Eh bien, tournez la dernière .+ en .+? (utiliser quantificateurs paresseux) et ajouter \s* avant $:

Concepto\s+(?>de la)?(?>tr.+erencia|traspaso)\s+(?P<concepto>.+?)\s*$ 
                   ^^^^ 

Voir la regex demo

Si le groupe "Concepto" peut être vide, remplacer .+? avec .*?. Puisque *?/+? sont paresseux, le \s* sera testé contre le premier, et ainsi tous les symboles d'espaces de fin seront en dehors du groupe "concepto".

De même, les groupes atomiques ((?>)) peuvent ici être remplacés par de simples groupes non-capturant ((?:)).

+0

Plus vite vous répondez, plus je me sens bête. : P Merci beaucoup :) – yivi