Comment faire correspondre la chaîne entre parenthèses (imbriquée) dans Java?
Je voudrais correspondre à une chaîne de caractères à l'intérieur des parenthèses comme:
(i, j, k(1))
^^^^^^^^^^^^
La chaîne peut contenir fermé entre parenthèses. Comment faire correspondre avec expression régulière Java sans écrire un analyseur syntaxique, puisque c'est une petite partie de mon projet. Merci!
Edit:
Je recherche une chaîne de bloc et de trouver quelque chose comme u(i, j, k)
u(i, j, k(1))
ou tout simplement u(<anything within this paired parens>)
et de les remplacer à __u%array(i, j, k)
et __u%array(i, j, k(1))
pour mon Fortran la traduction de l'application.
source d'informationauteur Li Dong
Vous devez vous connecter pour publier un commentaire.
Comme je l'ai dit, contrairement à la croyance populaire (ne pas croire tout ce que les gens disent) correspondant à imbriquée entre parenthèses est possible avec la regex.
L'inconvénient de l'utilisation, c'est que vous pouvez seulement jusqu'à un certain niveau d'imbrication. Et pour chaque niveau supplémentaire que vous souhaitez soutenir, votre regex sera de plus en plus gros.
Mais ne prenez pas mon mot pour lui. Laissez-moi vous montrer. La regex:
Correspond à un niveau de. Pour jusqu'à deux niveauxvous devez:
Et ainsi de suite. De continuer à ajouter des niveaux, tout ce que vous avez à faire est de modifier le milieu (deuxième)
[^()]*
partie de([^()]*|\([^()]*\))*
(vérifier trois niveaux ici). Comme je l'ai dit, ça va devenir de plus en plus gros.Votre problème:
Pour votre cas, deux niveaux peuvent être assez. Ainsi, le code Java pour elle serait:
D'entrée:
De sortie:
Ligne du bas:
Dans le cas général, analyseurs feront un meilleur travail - c'est pourquoi vous obtenez ainsi de pissy à ce sujet. Mais pour les applications simples, regexes pouvez très bien être suffisant.
Remarque: Certaines saveurs de regex soutien à la nidification de l'opérateur
R
(Java ne fonctionne pas, PCRE des moteurs PHP et Perl), qui vous permet de nid nombre arbitraire de niveaux. Avec eux, vous pouvez faire:\(([^()]|(?R))*\)
.Séparer votre travail. Ont la regex:
Le premier groupe contiendra l'identifiant, et le second les paramètres. Puis proceeed en tant que tel:
Remplacer
[a-z]+
avec tout ce que l'identificateur peut être en Fortran.Veuillez cocher cette réponse comme il le fait en gros ce que vous essayez de le faire (en bref, c'est pas vraiment possible avec les expressions régulières)
Expression régulière correspondant externe crochets