2016-10-06 3 views
1

J'utilise REGEX pour sélectionner des balises personnalisées, mais certaines de ces balises possèdent des balises internes du même nom. Je veux seulement sélectionner les étiquettes internes, ainsi je peux les traiter d'abord.Sélection du texte interne imbriqué uniquement

Mon REGEX est mélangé. Je pense que cela pourrait exiger une sélection récursive, mais je ne sais pas comment.

\[STORE.*?\]((.*?|\n)*)\[\/STORE\] 

Texte:

[STORE SMC, DODO]blah blah blah blah blah 

    [STORE SMC]blah[/STORE] 

    [STORE DODO]Blah[/STORE]. 

[/STORE] 

Some text here I do not want selected. 

[STORE SMC]blah[/STORE] 

Sélectionnez les balises dans une autre course ou le même terme?

+2

http://i.imgur.com/ls6Eygt.png –

+0

Ha, ok assez juste. J'utilise APEX (salesforce) qui est dérivé de Java. Nous avons des classes de modèle et de matcher. Je crois que javascript fonctionnera. – c14kaa

+0

Quelles sont vos correspondances? – anubhava

Répondre

1

Vous pouvez utiliser cette regex qui utilise un lookaahead négatif pour affirmer que nous ne recevons pas une autre [STORE ...] entre-deux avant la désinence [/STORE]:

\[STORE [^\]]*\](?:(?!\[STORE [^\]]*\])[\s\S])*?\[\/STORE\] 

RegEx Demo

Cela correspondra le plus à l'intérieur Tags STORE ou parent indépendant STORE étiquettes.

Je vous ai fourni une syntaxe Javascript. Si vous utilisez Java (Salesforce apax), vous pouvez utiliser:

String = regex = "\\[STORE [^]]*\\](?:(?!\\[STORE [^]]*\\]).)*?\\[/STORE\\]"; 
final Pattern pattern = Pattern.compile(regex, Pattern.DOTALL); 
+1

Un grand merci pour l'avoir! Je me suis gratté la tête toute la journée pour la comprendre. Très appréciée. – c14kaa