2011-06-29 1 views
0

Je suis en train de créer un projet qui doit correspondre à un texte situé à : text to match -. Par exemple, si j'ai cette chaîne:Expression régulière pour faire correspondre un texte à l'intérieur: -

nathanpc/ltweet: Poser une question à #StackOverflow: "Expression régulière pour correspondre à un texte Intérieur: -" - @devs

Je veux correspondre Asking a question at #StackOverflow: "Regular Expression To Match a Text Inside : -". Tout ce qui est après le premier : et le dernier -, mais quelle est l'expression régulière correcte pour le faire?

PS: J'utilise Javascript avec jQuery

Répondre

2

Si vous utilisez des expressions régulières Perl compatibles, comme ceux qu'on trouve dans la plupart des langues:

/:(.*)-/ 

Vous pourriez ne pas avoir besoin des barres obliques, en fonction de la langue. Le groupe de capture 1 obtiendra le contenu que vous voulez.

Le .* est un comparateur gourmand, il tentera donc de faire correspondre autant de caractères que possible, jusqu'au dernier tiret de l'entrée.

+1

True +1. Plus simple et immédiat. Peut-être que OP ne veut pas grouper les espaces '/: \ s (. *) \ S- /'. –

0

expressions régulières "standard" ne peut pas analyser ce texte exactement comme vous l'avez décrit. Cette analyse nécessite un contexte, qui ne peut pas être exprimé avec regex. Par exemple, lors de la réception du premier "-", comment l'expression ne se termine-t-elle pas? En dehors de ma tête, je peux seulement venir avec les expressions régulières étendues de Perl, qui permettent l'analyse des sous-expressions, mais ce ne sera pas facile, car vous devez compter les occurrences de ":" et "-" correspondre exactement le dernier.

1

Si vous utilisez un opérateur avide comme . il va essayer de former le plus grand correspondance possible (au moins dans les moteurs d'expression rationnelle Perl)

donc pour correspondre à cette chose aussi simple que :(.*)- fonctionnera.

Voir ce script exemple en Perl:

my $str = "Discard:Testing:- one two three -discard"; 
$str =~ m/:(.*)-/; 
print $1; 

$1 = "Testing:- one two three"

Ou en javascript ici: http://www.regular-expressions.info/javascriptexample.html

+0

Encore une fois, cela ne fonctionnera pas. Comment Perl sait-il ne pas s'arrêter au premier "-"? –

+0

C'est un opérateur gourmand. Perl essaie de l'étendre au maximum avant de l'abandonner. – Bayes

+0

La question est la définition de «abandonner» :) Encore une fois, cela ne fonctionnera pas en général. –

1

Cela fonctionne pour moi (rubis):

[^:]+:\s+([^-]+.*?)\s- 

Test:

test = "nathanpc/ltweet: Asking a question at #StackOverflow: 'Regular Expression To Match a Text Inside : -' - @devs" 

m = test.match /[^:]+:\s+([^-]+.*?)\s-/ 

puis

m[1].to_s 

produit

Asking a question at #StackOverflow: 'Regular Expression To Match a Text Inside : -' 

Comme d'autres l'ont remarqué la :(.*)- beaucoup plus simple fonctionne de la même.Peut-être sans espaces :\s(.*)\s-

Questions connexes