2010-02-27 10 views
2

J'essaye d'écrire un analyseur qui utilise deux caractères comme limites de jeton, mais je ne peux pas comprendre l'expression régulière qui me permettra de les ignorer quand je suis regex-échappe toute la chaîne.Expression régulière pour ignorer un certain nombre de répétitions de caractères

d'une chaîne comme:

This | is || token || some ||| text 

Je voudrais terminer par:

This \| is || token || some \|\|\| text 

où tous les | sont échappés à moins qu'il y en ait deux ensemble.

Y at-il une expression régulière qui me permettra d'échapper à chaque | ce n'est pas dans une paire?

+0

Quelle langue? Certains ont des capacités regex avancées. – vava

+0

Je travaille en python, mais essayez de tester les expressions à travers Regexr qui, je crois, utilise tout ce qui est intégré dans Flex. – kyleder

Répondre

2

Pas besoin de regex. Vous utilisez Python après tout. :)

>>> s="This | is || token || some ||| text" 
>>> items=s.split() 
>>> items 
['This', '|', 'is', '||', 'token', '||', 'some', '|||', 'text'] 
>>> for n,i in enumerate(items): 
...  if "|" in i and i.count("|")!=2: 
...   items[n]=i.replace("|","\|") 
... 
>>> print ' '.join(items) 
This \| is || token || some \|\|\| text 
0

Voici une façon de le faire avec des expressions régulières dans Perl, si quelqu'un est intéressé. J'ai utilisé deux expressions régulières distinctes, une pour le match unique et une pour le match 3 ou plus. Je suis sûr qu'il est possible de les combiner, mais les expressions régulières sont déjà assez difficiles à lire sans ajouter de complexité inutile.

#!/usr/bin/perl 

#$s = "This | is || token || some ||| text"; 
$s = "| This |||| is || more | evil |"; 

$s =~ s/([^|]|^)(\|)([^|]|$)/\1\\\2\3/g; 
$s =~ s{(\|{3,})} 
{ 
    $a = $1; 
    $a =~ s{\|} {\\\|}g; 
    $a; 
}eg; 

print $s . "\n"; 

Sorties:

\| This \|\|\|\| is || more \| evil \| 
1

Je ne vois pas pourquoi vous auriez besoin de regex échapper aux jetons, mais pourquoi ne pas diviser la chaîne première et puis leur échapper? Cette regex se divise sur deux tuyaux qui ne sont pas précédées ou suivies de plusieurs tuyaux:

re.split('(?<!\|)\|\|(?!\|)', 'This | is || token || some ||| text') 
>>> ['This | is ', ' token ', ' some ||| text'] 

Soit dit en passant, il y a des testeurs pour tous les goûts regex plus communs là-bas pour la recherche sur Google. En voici une pour Python: http://re.dabase.com/

Questions connexes