Java Ssortingng split ne renvoyant pas les bonnes valeurs

J’essaie d’parsingr un fichier txt qui représente une grammaire à utiliser dans un parsingur de descente récursif. Le fichier txt ressemblerait à ceci:

SPRIME :: = Expr eof
Expr :: = Term Expr ‘
Expr ‘:: = + Terme Expr’ | – Terme Expr ‘| e

Pour isoler le côté gauche et diviser le côté droit en règles de production séparées, je prends chaque ligne et appelle:

Ssortingng[] firstSplit = line.split("::="); Ssortingng LHS = firstSplit[0]; Ssortingng productionRules = firstSplit[1].split("|"); 

Cependant, lorsque j’appelle la deuxième méthode de division, je ne suis pas renvoyé un tableau des chaînes séparées par le “|” caractère, mais un tableau de chaque caractère individuel sur le côté droit, y compris “|”. Par exemple, si j’analysais la règle Expr et imprimait le tableau productionRules, cela ressemblerait à ceci:

“+”
“Terme”
“Expr ‘”
“”
“|”

Quand ce que je veux vraiment devrait ressembler à ceci:

  • Terme Expr ‘

Quelqu’un a une idée de ce que je fais mal?

Étant donné que split prend une expression régulière comme argument, vous devez échapper à tous les symboles d’expression régulière non prévus.

Le paramètre de Ssortingng.split() est une expression régulière et le caractère de barre vertical est spécial.

Essayez de lui échapper avec une barre oblique inverse:

 Ssortingng productionRules = firstSplit[1].split("\\|"); 

NB: deux barres obliques inverses sont requirejses, car le caractère barre oblique inverse lui-même est spécial dans les littéraux de chaîne.

Vous devez échapper le symbole pipe ( | ) qui est un opérateur regex OR .

 Ssortingng productionRules = firstSplit[1].split("\\|"); 

ou

 Ssortingng productionRules = firstSplit[1].split(Pattern.quote("|")); 

Le caractère de pipe est l’opérateur de regex pour “ou”. Ce que tu veux c’est

 Ssortingng productionRules = firstSplit[1].split("\\|"); 

qui lui dit de rechercher un caractère de pipe réel.