2015-12-10 4 views
1

J'ai des chaînes commeRegEx: Obtenir tous les mots jusqu'à 4 derniers mots

  1. wwww-wwww-wwww
  2. wwww-www-ww-ww

Beaucoup w séparés par -
Mais ce n'est pas wwww-wwww régulière, il pourrait être w-w-w-w ainsi

J'essaie de trouver une regex qui capture chaque mot jusqu'aux 4 derniers mots.
Ainsi, le résultat par exemple 1 serait la première de 8W (wwww-wwww)
Pour 2 exemple

de la première 5w (wwww-w) Est-il possible de le faire en regex? J'ai quelque chose comme ça en ce moment:

^\w*(?=\w{4}$) 

ou peut-être

[^-]*(?=\w{4}$) 

J'ai 2 problèmes avec mes "solutions":

  1. les 4 derniers mots ne seront pas capturés par exemple 2. Ils sont interrompus par le -

  2. les mots avant les 4 derniers ne seront pas capturés. Ils sont interrompus par le -.

+0

Le comptage des délimiteurs pourrait être une bonne idée, je peux vous fournir une solution 'awk', est-ce suffisant? – Yaron

+0

Pourriez-vous reformater votre message avec un anglais complet? –

+0

J'ai déjà une solution en PHP. Je veux juste savoir si c'est possible juste avec 1 preg_replace – Sneazel

Répondre

1

Oui, il est possible avec une assertion avant un peu plus sophistiqué:

/\w(?=(?:-*\w){4,}$)/x 

Explication:

/  # Start of regex 
\w  # Match a "word" character 
(?=  # only if the following can be matched afterwards: 
(?: # (Start of capturing group) 
    -* # - zero or more separators 
    \w # - exactly one word character 
){4,} # (End of capturing group), repeated 4 or more times. 
$  # Then make sure we've reached the end of the string. 
)  # End of lookahead assertion/x 

Testez live on regex101.com.