2010-01-21 7 views
0

Je suis en train de dépouiller et de remplacer une chaîne de texte de la manière la plus élégante possible:Expression régulière en Java

Avec la solution que j'ai /element\s*\{"([^"]+)"\}\s*{text\s*{\s*}\s*({[^}]*})/

text.replaceAll("element\\s*\\{\"([^\"]+)\"}\\s*\\{text\\s*\\{\\s*}\\s*(\\{[^}]*})", "<$1> $2")); 

Utilisé sur le texte ci-dessous:

element {"item"} {text { } {$i/child::itemno} text { } {$i/child::description} text { } element {"high_bid"} {{max($b/child::bid)}} text { }} 

DONNE:

<item> {$i/child::itemno} text { } {$i/child::description} text { } element {"high_bid"} {{max($b/child::bid)}} text { }} 

Quand je suis en train de réaliser:

<item>{$i/child::itemno}{$i/child::description}<high_bid>{fn:max($b/child::bid)}</high_bid></item> 

Répondre

2

Après examen, le problème est que l'expression régulière correspond à une seule fois.

Votre regex recherche élément { "tag"} {text {} {text_here}

Cela se produit qu'une seule fois dans votre entrée:

element {"item"} {text { } {$i/child::itemno} 

Rien ne correspond à autre:

text { } element {"high_bid"} { => NO MATCH, text without element before it 

element {"high_bid"} {{max($b/child::bid)}} text { } => NO MATCH, text after braces 

Donc, soit votre entrée est mauvaise, soit vous avez besoin de quelque chose de mieux qu'une regex en une fois. Cela dit, je ne pense pas qu'une regex fonctionnera ici. Vous pouvez supprimer tous les « texte {} » éléments, qui semblent ne rien faire:

text.replaceAll("text\\s*\\{\\s*}", "")); 

Ce qui vous donne:

element {"item"} { {$i/child::itemno} {$i/child::description} element {"high_bid"} {{max($b/child::bid)}} } 

Mais le problème ici est que vous avez la nidification. Si vous faites simplement correspondre sur des accolades, comment savez-vous jusqu'où aller? Vous avez besoin de votre regex pour comprendre le nombre d'accolades ouvrantes et trouver l'accolade de fermeture correcte. Ce n'est pas vraiment faisable avec des expressions régulières. Vous avez besoin d'une fonction qui analyse la chaîne en comptant les accolades ouvrantes et en soustrayant les accolades fermantes. Lorsque vous obtenez un compte de zéro, vous avez trouvé un ensemble ... Bien sûr, ce ne sont pas des expressions régulières.

+0

Je pense au contraire, j'en ai besoin pour être plus gourmand. Il supprime uniquement le premier élément et les premières instances de texte. – Pablo

+0

Bien au contraire. Voir ma clarification dans la réponse. Il semble seulement qu'il n'a pas remplacé les dernières occurrences parce qu'ils ont été aspiré dans le premier texte. Après cela, plus aucun remplacement ne se produit parce que les remplacements ne se produisent pas sur le texte remplacé. –

+0

Puis-je demander quel était le but de me dire d'ajouter '?' Mon but est de scanner la chaîne entière pour n'importe quelle instance de l'un ou l'autre groupe – Pablo