2009-11-27 2 views
1

J'ai une chaîne qui contient des mots avec des parenthèses. J'ai besoin de retirer le mot entier de la chaîne. Par exemple: pour l'entrée "car wheels_(four) klaxon", le résultat devrait être "car klaxon". Est-ce que quelqu'un peut me donner un exemple qui permettrait d'accomplir cela?Comment puis-je supprimer un mot d'une chaîne?

Répondre

6

Vous pouvez le faire avec des expressions régulières. L'expression régulière dont vous avez besoin est:

"\s?\S+[()]\S+\s?" 

Cela supprime un mot contenant soit (ou) ou les deux, et supprime le mot et affaisse les espaces autour. Le match devrait être remplacé par un seul espace.

En C# l'expression régulière pourrait être utilisé comme ceci:

string s = "car wheels_(four) klaxon"; 
    s = Regex.Replace(s, @"\s?\S*[()]\S*\s?", " "); 

Je ne suis pas tout à fait sûr de la traduction de VB pour cela, mais nous espérons que vous pouvez comprendre.

+0

votre regex vient de me faire peur – JohnIdol

+0

Un gotcha potentiel: ceci correspondra à n'importe quel mot avec une parenthèse même si la parenthèse n'est pas équilibrée. Cela peut ou peut ne pas être désiré. – Welbog

+0

Merci Marc, ça marche bien mais si on a un mot comme "(roue)" ne remplace pas le mot: P –

1

légèrement différent:

sed "s/\s\+\S*(.\+)\S*\s\+/ /g" yourfile 

Il fonctionne comme ceci:

votrefichier:

car wheels_(four) klaxon 
ciao (wheel) hey 
foo bar (baz) qux 
stack overflow_(rulez)_the world 

transformé en:

car klaxon 
ciao hey 
foo bar qux 
stack world 
+1

Whoah. Regexs règne une fois de plus sur le monde. http://xkcd.com/208/ – Tonio

+0

Ne fonctionne pas tout à fait. Sur 'foo bar (baz) qux' vous obtenez "foo qux" au lieu de "foo bar qux". Vous devez faire correspondre les non-espaces pour éviter de faire correspondre plusieurs mots. –

+0

Voici un autre cas de test: 'foo ba (r baz qu) x quux.' L'affiche ne précisait pas ce qu'il voulait dans ce cas, donc je ne sais pas quel devrait être le résultat correct, mais nous différons dans nos résultats pour ce cas. –

0

Si la vitesse est pas un problème et vous voulez éviter la surcompensation expressions régulières, vous pouvez utiliser String.Split sur "" pour créer un tableau de "mots", parcourir chaque mot, remplacer tout ce qui String.Contains "(" avec une chaîne vide, puis utiliser String.Join avec un séparateur de "" pour obtenir vos résultats.

Désolé, impossible d'envoyer le codez, ne disposez pas d'un compilateur VB.NET.

Questions connexes