Envisagez (c'est un non-sens total pseudo-langue):script texte Divisé en sous-chaînes par modèle
if (Request.hostMatch("asfasfasf.com") && someString.existsIn(new String[] {"brr", "hrr"})) {
if (Requqest.clientIp("10.0.x.x")) {
somevar = "1";
}
somevar = "2";
}
else {
somevar = "first";
}
string foo = "foo";
// etc. etc.
Comment voulez-vous saisir si-bloc de paramètres et contenu de ce? Le cas du bloc a le format de:
if<whitespace>(<parameters>)<whitespace>{<contents>}<anything>
J'ai essayé d'utiliser String.split()
avec motif regex de ^if\s*\(|\)\s*\{|\}\s*
mais échoue lamentablement. A savoir, le problème est que ) {
se trouve également dans le bloc interne if et la fermeture }
est trouvée à partir de nombreux endroits. Je ne pense pas que ni l'expansion paresseuse ou impatiente fonctionne ici.
Alors ... des pointeurs sur ce dont j'ai besoin ici pour l'implémenter avec regex?
J'ai également besoin d'obtenir la chaîne restante sans le code if-block (donc le code à partir de else { ...
). L'utilisation de String.split()
semble difficile car il n'y a aucune information sur la longueur des parties analysées.
J'ai initialement créé une solution basée sur une boucle (en utilisant String.substring()
fortement) pour cela, mais c'est terne. Je voudrais avoir quelque chose d'amateur à la place. Dois-je aller avec regex ou créer une fonction générique, personnalisée (il y a beaucoup d'autres cas que cela) qui prend la chaîne parseable et le modèle à la place (pensez au modèle if<whitespace>(...
ci-dessus)?
Édition: Les valeurs modifiées ont été renvoyées aux affectations de variables, car cela n'aurait pas été logique autrement.
En tant que langage non-régulier, cela ne peut pas être analysé par regex. Vous devrez utiliser un analyseur si vous voulez que cela soit fait de manière fiable. – NullUserException
Vous voulez élaborer ce que vous voulez dire par langage non régulier? La langue a une structure stricte, c'est très bash mais il y a des cas spéciaux, oui.Cependant, tout est "structuré". –
Ok, les trucs non réguliers sont expliqués/liés dans la réponse de Trey. Regarde ça. –