2010-09-26 2 views
-3

Couple de questions:Comment puis-je faire correspondre des séries de | avec une regex Java?

1) Comment faire la regex suivante qui est basée sur le littéral de recherche^travail pour le littéral de recherche |

recherche littérale regex basée^(qui fonctionne très bien, qui est l'une des contributions précieuses de ce forum):

String intermediateResult = in.replaceAll("(TEST\\^[^^]*\\^\\^[^^]*\\^[^^]*\\^)\"\"\\^", "$1^"); 
String finalResult = intermediateResult.replaceAll("(TEST\\^[^^]*\\^)(\\^[^^]*\\^[^^]*\\^([^\"\\^].*|\"[^\"].*))", "$1ST$2"); 

Quand je remplace^(où jamais nécessaire) à | comme suit: - Je ne suis pas le résultat souhaité (il ne change rien dans la chaîne donnée):

String intermediateResult = in.replaceAll("(TEST\\|[\\|\\|]*\\|[\\|\\|]*\\|[\\|\\|]*\\|[\\|\\|]*\\|)\"\"\\|", "$1|"); 
String finalResult = intermediateResult.replaceAll("(TEST\\|[\\|\\|]*\\\\|)(\\|[\\|\\|]*\\|[\\|\\|]*\\|([^\"\\^].*|\"[^\"].*))", "$1ST$2"); 

Existe-t-il des problèmes connus avec | dans java regex ou ai-je besoin d'avoir la regex différemment pour la recherche littérale |

J'ai donc essayé de cette façon, mais en vain (Avoir \\ | au lieu de \ |):

Première regex change tous les lieux qui sont comme | "" | dans la chaîne donnée, bien que je m'attends à ce qu'il ne soit pas vide seulement si le contenu entre la 5ème et la 6ème occurence de | est "", je ne sais pas pourquoi. La deuxième regex ne change pas du tout la chaîne pour une raison quelconque.

String intermediateResult = in.replaceAll("(TEST\\|[\\|\\|]*\\\\|[\\|\\|]*\\\\|[\\|\\|]*\\\\|[\\|\\|]*\\\\|)\"\"\\|", "$1|"); 
String finalResult = intermediateResult.replaceAll("(TEST\\|[\\|\\|]*\\\\|)(\\\\|[\\|\\|]*\\\\|[\\|\\|]*\\|([^\"\\^].*|\"[^\"].*))", "$1ST$2"); 

2) Aussi qu'est-ce que la partie du match et remplacement str de cette regex implique:

String finalResult = intermediateResult.replaceAll("(TEST\\^[^^]*\\^)(\\^[^^]*\\^[^^]*\\^ 
**([^\"\\^].*|\"[^\"].*)**)", "**$1ST$2**"); 

extrêmement désolé pour la confusion et le long post; Je vais poster une seule question et poster l'autre question dans un poste différent à des fins de clarté.

L'élaboration de la première question de l'e-mail d'origine:

je la chaîne suivante (chaque ligne est séparée par \ r \ n). Le premier regex lié à la recherche littérale | est censé vérifier si le contenu entre la deuxième et la troisième occurrence de | est vide et si le contenu entre le 5ème et le 6ème | est "", alors faites le vide.

2ème regex (encore lié à |) doit voir si le contenu entre la 5ème et 6ème occurrence de | n'est pas vide et non nul, alors rend le contenu entre la deuxième occurrence de 2ème et 3ème comme ST.

Exemple comme suit:

chaîne existante:

TEST|X||Y||**""**|C|""|\r\n\ 
TEST|Z||Y||SOMETHING OTHER THAN "" OR empty||\r\n\ 

sortie désiré lorsque le | lié à deux regex replaceall() de l'affichage d'origine sont exécutés:

TEST|X||Y|||C|""|\r\n\ 
TEST|Z|**ST**|Y||SOMETHING OTHER THAN "" OR empty||\r\n\ 
+3

Veuillez développer votre question. Que voulez-vous faire correspondre avec l'expression? Que signifie * pour le littéral de recherche | *? –

+2

Regex en Java! S'il vous plaît arrêter de me faire mal aux yeux! ... Sur un ton plus sérieux, les questions regex sont bien meilleures quand les regex ne sont pas rendues encore plus illisibles par cette lacune de Java. Il suffit de poster les expressions rationnelles sur leur propre et se débarrasser du Java. A moins que la question ne concerne réellement Java (j'ai du mal à le comprendre). –

+1

Ne posez pas plusieurs questions dans un seul article. –

Répondre

1

J'ai trouvé une erreur dans votre conversion. Le motif [^^] signifie "un caractère, ce n'est pas un '^'". Ainsi, pour le convertir en "|", ce serait [^|] (à l'intérieur de [], aucune échappée n'est nécessaire pour |). Maintenant, je vais prendre une fourchette et me piquer les yeux. Je ne veux plus jamais revoir ça.

+0

Merci pour votre contribution! Désolé pour la longue regex. Donc, la correction que vous avez mentionnée est dans la deuxième regex - String finalResult = intermediateResult.replaceAll (xxxxx) mentionné dans le 2ème extrait de code? Merci encore! –

+0

Oui, remplacez tous [\\ | \\ |] par [^ |]. – Cephalopod

+0

Merci. J'ai fait le changement mais ST n'est pas placé dans la position désirée lors du test. Les modifications sont les suivantes: –

Questions connexes