2012-08-01 9 views
1

Je souhaite extraire des informations du tweet suivant entre les deux premières paires de tubes.Regex: Extrait des caractères spécifiques

"TRV_Insurance" || "Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" || "en" || "Wed, 04 Apr 2012 14:27:24 +0000" || NH || South Tamworth 

-à-dire, je ne veux que « les clients touchés par des voyageurs mauvais temps récents TX peuvent signaler les dommages au 800.252.4633 ou en ligne à http://t.co/NK4z2EpQ #tornado »

Cette information est entre la première paire de Teo de tuyaux. Je veux exclure tous les autres tuyaux sauf les deux premiers. C'est possible.

mon regex

(?<=||)(.*?)(?=||) 

Je ne suis pas en mesure de comprendre comment inclure deux premiers « || » et ignore les autres.

Merci

Répondre

0

utiliser cette regex:

(?<=(\|\|)|^)(.*?)(?=(\|\|)|$)

+0

Le tweet d'entrée contient 5 paires de tubes (||). Mais j'ai besoin d'extraire des données entre les deux premiers tuyaux seulement. –

+0

Vous avez raison sur les barres qui ont besoin d'échappement, mais les options^et $ signifient qu'elles renverront toutes les valeurs, et pas seulement la seconde, à quel point vous pourriez aussi bien utiliser exploser. – Braiba

0

Quelle langue utilisez-vous?

Vous pouvez utiliser ce modèle comme:

[^|]+ 

à tout match entre ||, puis extraire votre chaîne.

Par exemple, en javascript:

var string = '"TRV_Insurance" || "Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" || "en" || "Wed, 04 Apr 2012 14:27:24 +0000" || NH || South Tamworth'; 

var array = string.match(/[^|]+/g); 
tableau

[1] est votre réponse ;-)

[modifier]; Si vous ne pouvez pas utiliser de tableaux, essayez:

(?<=([^|]\|\|))[^|]+ 

sans indicateur global. Ce modèle utilise un lookbehind positif pour la première chaîne et ||, puis tout attrape sauf ||

[modifier]; Juste pour éviter de problème lorsque les données d'entrée contient « | »:

(?<=([^|]\|\|)).+?(?=(\|\|)) 
+0

Je ne peux pas utiliser des tableaux. J'utilise IBM AQL. –

+0

Si simple (? <= ([^ |] \ | \ |)) [^ |] + Avec lookbehind et sans drapeau global devrait faire l'affaire –

+0

Si les données elles-mêmes contiennent une barre verticale, l'utilisation de [^ |] + pourrait vous faire retourner les mauvaises données. – Braiba

1

Dans votre regex, vous ne l'avez pas échappé à la | donc ils vont agir en tant qu'opérateurs OR. La regex correcte serait:

(?<=(\|\|)(.*?)(?=(\|\|)) 
1

Quelque chose comme ça a fonctionné pour moi: ^.*?\|\|(.+?)\|\|. Dans le langage d'expressions régulières, le tube est un caractère spécial (dénote l'opérateur OR), il doit donc être échappé. Étant donné que vous devez faire correspondre les deux premiers, l'ajout de l'ancre avant (^) demandera au moteur d'expression régulière de démarrer la correspondance au début de la chaîne.

Vous pouvez ensuite utiliser des groupes pour accéder au contenu entre les canaux.

Je l'ai essayé en Java:

Pattern p = Pattern.compile("^.*?\\|\\|(.+?)\\|\\|"); 
String str = "\"TRV_Insurance\" || \"Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado\" || \"en\" || \"Wed, 04 Apr 2012 14:27:24 +0000\" || NH || South Tamworth"; 

Matcher m = p.matcher(str); 
if (m.find()) 
{ 
    System.out.println(m.group(1)); 
} 

Rendement:

"Travelers customers impacted by recent TX severe weather can report damage at 800.252.4633 or online at http://t.co/NK4z2EpQ #tornado" 
+0

Je pensais que les moteurs regex commençaient toujours à correspondre au début de la chaîne de toute façon ... Pourquoi ne le feraient-ils pas, sauf peut-être si votre motif se termine par une ancre $ incontournable? – Braiba

+0

(+1 pour simplifier les choses en n'utilisant pas lookahead/lookbehind quand vous pouvez simplement récupérer le sous-masque à la place.) – Braiba

+0

@Braiba: Le moteur Regex commencera à correspondre au moment où le premier caractère du motif est rencontré dans la chaîne donnée. L'ajout d'ancres forcera simplement le moteur à commencer à correspondre au début de la chaîne ou à terminer la correspondance à la fin de la chaîne, selon le cas. – npinti

1

Je pense que vous travaillez trop dur. Regex peut être assez difficile. À titre d'idée, puisque vos données semblent être structurées et délimitées de manière fiable, pourquoi ne pas les séparer avec ce délimiteur?

Voici un exemple de travail avec Javascript. J'imagine que les fonctions de split devraient être similaires et disponibles dans n'importe quel langage de programmation que vous utilisez.

http://jsfiddle.net/T8E3g/

+0

Je ne peux pas utiliser une autre méthode. J'ai une exigence particulière –

+0

Oui, j'ai remarqué que vous avez un environnement plutôt spécifique qui limite vos choix. Bonne chance et il semble que d'autres pourraient avoir des solutions. – user1441141

0

perl regex sont acceptés dans ibm AQL. S'il s'agit d'une regex "étendue", il n'est pas nécessaire d'échapper des caractères spéciaux comme '|' mais d'autres chars non spéciaux doivent être échappés. Donc, un tuyau littéral doit être échappé.

une expression régulière comme celui-ci doit correspondre:

^([^\|]+\|)*\|([^|]*) 

puis dans la deuxième référence arrière, vous aurez la chaîne nécessaire.

Questions connexes