2008-09-16 6 views

Répondre

4
/###(.+?)###/ 

si vous voulez alors l '### dont vous avez besoin

/(###.+?###)/ 

le ? signifie non gourmand, si vous n'avez pas le ?, alors il en prendrait trop.

par exemple. '###token1### text text ###token2###' serait tout attrapé.

Ma réponse initiale avait un * au lieu d'un +. * signifie 0 ou plus. + signifie 1 ou plus. * était faux parce que cela permettrait ###### comme une chose valide à trouver.

Pour jouer avec des expressions régulières. Je recommande fortement http://www.weitz.de/regex-coach/ pour les fenêtres. Vous pouvez taper la chaîne que vous voulez et votre expression régulière et voir ce qu'elle fait réellement.

Votre texte sélectionné sera stocké en \ 1 ou $ 1 selon l'endroit où vous utilisez votre expression régulière.

+0

Juste une note en Java, ce serait dans le groupe (1) de l'instance de matcher après le dernier appel à trouver () – cynicalman

0

En supposant que vous voulez faire correspondre ### token2 ### et ...

/###.+###/ 
0

utilisation() et \ x. Un exemple naïf qui suppose le texte dans les jetons est toujours délimité par #:

text (#+.+#+) text text (#+.+#+) text text 

Les choses dans le() peut alors être saisi en utilisant \ 1 et \ 2 (\ 1 pour le premier set, \ 2 . pour la seconde dans l'expression de remplacement (en supposant que vous faites une recherche/remplacement dans un éditeur) par exemple, l'expression de remplacement pourrait être:

token1: \1, token2: \2 

pour l'exemple ci-dessus, qui devrait produire:

token1: ###token1###, token2: ###token2### 

Si vous utilisez une bibliothèque regexp dans un programme, vous appelez probablement une fonction pour obtenir le premier et le second jeton du contenu, que vous avez indiqués avec les() s qui les entourent.

0

Eh bien, lorsque vous utilisez des délimiteurs comme celui-ci, il vous suffit de saisir le premier, puis tout ce qui ne correspond pas au délimiteur de fin suivi du délimiteur de fin.Une attention particulière devrait être dans les cas où l'exemple ci-dessus [^ #] ne fonctionnerait pas comme vérification pour s'assurer que le délimiteur de fin n'est pas là car un singe # ferait échouer l'expression régulière (par exemple "### foo # bar # ##). Dans le cas ci-dessus l'expression rationnelle à analyser serait la suivante en supposant que les jetons vides sont autorisés (sinon, changer * à +):

### ([^ #] | # [^ #] | ## [^ #]) * ###

1

en Perl, vous voulez vraiment quelque chose comme ceci:..

$text = 'text ###token1### text text ###token2### text text'; 

while($text =~ m/###(.+?)###/g) { 
    print $1, "\n"; 
} 

ce qui vous donnera chaque jeton à son tour dans la boucle tandis que le (* ?) assure que vous obtenez le le plus court bit entre les délimiteurs, l'empêchant de penser que le jeton est 'token1 ### text text ### token2'.

Ou, si vous voulez juste pour les sauver, pas en boucle immédiatement:

@tokens = $text =~ m/###(.+?)###/g; 
Questions connexes