2010-01-21 14 views
1

Je pensais à fournir les regex suivante en réponse à this question, mais je ne peux pas sembler écrire l'expression régulière que je cherchais:Regex - assorti d'un mot Les abréviations

w?o?r?d?p?r?e?s?s? 

Cela devrait correspondre une abréviation ordonnée du mot wordpress, mais il peut également ne correspondre à rien du tout.

Comment puis-je modifier l'expression régulière ci-dessus pour qu'elle corresponde à au moins 4 caractères dans l'ordre? Comme:

  • mot
  • wrdp
  • presse
  • wordp
  • wpress
  • wordpress

Je voudrais savoir quelle est la meilleure façon de le faire. .. =)

Répondre

5

Vous pouvez utiliser une assertion avant:

^(?=.{4})w?o?r?d?p?r?e?s?s?$ 
+0

Il semble trouver des abréviations dans le désordre comme 'wodr'. –

+0

Alix on ne sait pas exactement quelles abréviations sont correctes et lesquelles ne le sont pas: pourquoi "wrdp" oui et "wodr" non? –

+0

@kemp: Je suis désolé, ils devraient tous les deux être d'accord parce que le 'r' apparaît deux fois. 'wodw' celui-ci ne devrait pas être apparié. Désolé pour la confusion. –

2
if (strlen($string) >= 4 && preg_match('#^w?o?r?d?p?r?e?s?s?$#', $string)) { 
    // abbreviation ok 
} 

Cela ne fonctionnera pas même le regexp sauf si la chaîne est au moins 4 caractères longue.

0

Je sais que ce n'est pas une expression régulière, juste pour le plaisir ...

#!/usr/bin/python 

FULLWORD = "wordprocess" 

def check_word(word): 
    i, j = 0, 0 
    while i < len(word) and j < len(FULLWORD): 
     if word[i] == FULLWORD[j]: 
      i += 1; j += 1 
     else: 
      j += 1 

    if j >= len(FULLWORD) or i < 4 or i >= len(FULLWORD): 
     return "%s: FAIL" % word 
    return "%s: SUCC" % word 

print check_word("wd") 
print check_word("wdps") 
print check_word("wsdp") 
print check_word("wordprocessr")