2009-03-11 5 views
0

Qu'est-ce que regex peut prendre l'une des lignes ci-dessous en entréeregexp pour couper la queue en option

rtsp://server/blabla/bla RTSP/1.0 
rtsp://server/blabla/bla/ 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla/streamid=65335 RTSP/1.0 

et retourne toujours:

rtsp://server/blabla/bla 

En général j'ai une URL arbitraire qui commence toujours par "rtsp://" et éventuellement se termine par EOL, "/", " RTSP/1.0" ou "/streamid=65335 RTSP/1.0".

Je dois obtenir l'URL uniquement, c'est-à-dire sans les parties finales facultatives.

Merci.

+0

Aucune des URL d'entrée ne contient "9C8CE56C490F2C87" alors où obtenez-vous cela? Je pense que vous devez mieux expliquer votre question. –

+0

Pourriez-vous clarifier un peu cela. Quel est le modèle qui devrait correspondre? Même ". *" Pourrait être utilisé pour faire correspondre n'importe quelle ligne. – Gumbo

+0

S'il vous plaît, voir mon poste édité en haut à nouveau. – jackhab

Répondre

2

Ceci devrait capturer le nom du serveur.

/rtsp:\/\/([^\/]+)/ 

de nouvelles exigences (cela enlève arrière):

linux ~ $ echo "rtsp://server/blabla/bla RTSP/1.0 
rtsp://server/blabla/bla/ 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla/streamid=65335 RTSP/1.0 
" | perl -pe 's/(RTSP\/1.0|\/|\/streamid=65335 RTSP\/1\.0)$//g' 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla 

Celui-ci capte url:

echo "rtsp://server/blabla/bla RTSP/1.0 
rtsp://server/blabla/bla/ 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla/streamid=65335 RTSP/1.0 
" | perl -pe 's/(.+?)(?: RTSP\/1.0|\/|\/streamid=65335 RTSP\/1\.0)$/\1/' 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla 
rtsp://server/blabla/bla 
+0

J'ai besoin de toute l'URL, pas seulement du serveur. Mais l'URL sans toute la partie finale. S'il vous plaît, voir mon post édité en haut à nouveau. – jackhab

1

bien que cela va faire exactement ce que vous venez de poser pour:

$pattern = '/rtsp:\/\/server\/.*/' 
$replace = 'server/9C8CE56C490F2C87'; 

preg_replace($pattern, $replace, 'rtsp://server/blabla/bla RTSP/1.0'); 

Si vous voulez obtenir tout avant que l'espace de ceci fonctionne:

$pattern = '/([^ ]+).*/' 

preg_replace($pattern, '$1', 'rtsp://server/blabla/bla RTSP/1.0'); 
+0

J'ai besoin de l'URL entière. Mais l'URL sans toute la partie finale. S'il vous plaît, voir mon post édité en haut à nouveau. – jackhab

0

Vous cherchez quelque chose comme ceci:

^rtsp://([^/]+) 

Et puis le remplacer par "$1/9C8CE56C490F2C87"?

1

Vous pouvez correspondre:

(.*?)(\/streamid\=65335)?(\/)?(RTSP\/1.0)?(\n)?$ 

et en lecture seule le premier groupe. En fonction de la langue que vous utilisez, il peut être plus clair d'utiliser le traitement de chaîne. Par exemple en Python:

for suffix in ('\n', ' RTSP/1.0', '/streamid=65335', '/'): 
    if url.endswith(suffix): 
     url= url[:-len(suffix)] 
+0

Je suis d'accord qu'il ne devrait pas regarder une regex dans ce cas, mais il utilise C (ou C++?) Pour ce que ça vaut. –

1

En fonction de vos nouveaux critères, je ne pense pas que vous avez besoin d'une expression régulière.

EDIT: Suppression de solution Perl, puisque vous utilisez C. Utilisation C, faites ceci:

str[20] = 0; // string is now NUL-terminated to 20 characters 
if(!strcmp(str, "rtsp://server/blabla/bla")) 
    { 
    // do stuff if it matches 
    } 
else 
    { 
    // do stuff if it doesn't match 
    } 

Ou, si vous voulez garder la chaîne d'origine:

if(!strncmp(str, "rtsp://server/blabla/bla", 20)) // only compare 20 chars 
    { 
    // do stuff if it matches 
    } 
else 
    { 
    // do stuff if it doesn't match 
    } 

Vous pouvez vouloir faire la solution strncmp(). De cette façon, vous pouvez faire varier la longueur d'une requête à une base de requête.

+0

désolé mais j'utilise les fonctions regex de la bibliothèque GNU C – jackhab