xqueryxquery-3.0

Split a string based on Pipe delimiter and except inside brackets ()


I want to split a string by '|' delimiter and exclude those inside the brackets (). I used tokenize function to split by delimiter and have some issue with exclusion part(RegEx format). Please help.

Input: Test|Test1|Test2|(Test3|Test4)|Test5|(Test6)(Test7)|Test8

Output: Test,Test1,Test2,(Test3|Test4),Test5,(Test6)(Test7),Test8

Thanks in advance.


Solution

  • Perhaps the analyze-string function suffices to break up the string, I don't think the single example makes the rules clear but it would be like

    analyze-string('Test|Test1|Test2|(Test3|Test4)|Test5|(Test6)(Test7)|Test8','(\([^)]*\))+')/*
    /(if (. instance of element(fn:match)) then data() else tokenize(., '\|'))[normalize-space()]
    

    either => string-join(',') that result or use

    declare option output:method 'text';
    declare option output:item-separator ',';
    
    analyze-string('Test|Test1|Test2|(Test3|Test4)|Test5|(Test6)(Test7)|Test8','(\([^)]*\))+')/*
    /(if (. instance of element(fn:match)) then data() else tokenize(., '\|'))[normalize-space()]