Join the #BuildWithBuildAgent Challenge! Get recognized, earn exclusive swag, and inspire the ServiceNow Community with what you can build using Build Agent.  Join the Challenge.

Please provide me the regex for extracting CN

Chandra18
Mega Sage

Hi,

I am working with a field that contains LDAP Distinguished Names (DNs) concatenated using ^ as a separator. I need to extract the CN (Common Name) from each DN. CNs can be either numeric IDs (e.g., 02042174) or person names that may include escaped commas (e.g., DUNN\, KAREN {FLNA}).


Sample input (single string)

CN=DUNN\, KAREN {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=King\, Alzra {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=02042174,OU=PCNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wilson\, Brian J {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt..........................

 

Expected CN outputs: I need to extract CN from all DN in the below format.

DUNN, KAREN {FLNA}
King, Alzra {FLNA}
02042174
Wilson, Brian J {FLNA}


I have written this script but not showing result as expected :

var members = "CN=DUNN\, KAREN {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=King\, Alzra {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=02042174,OU=PCNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wilson\, Brian J {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt";

var dnArray = members.split('^');

for (var i = 0; i < dnArray.length; i++) {
    var dn = dnArray[i].trim();
    if (!dn) continue;

    // Extract CN value
    var cnMatch = dn.match(/CN=([^,]+)/);
    if (!cnMatch) continue;

    var cnValue = cnMatch[1].replace("\\,", ",").trim();
    gs.info("Chandra@@@: CNmatch: " + cnValue);
}


Please correct this where needed.

Thank You in advanced.

10 REPLIES 10

Ankur Bawiskar
Tera Patron
Tera Patron

@Chandra18 

try this

var members = "CN=DUNN\\, KAREN {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=King\\, Alzra {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=02042174,OU=PCNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wilson\\, Brian J {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt";

var dnArray = members.split('^');
var cns = [];

for (var i = 0; i < dnArray.length; i++) {
    var dn = dnArray[i].trim();
    if (!dn) continue;

    // Extract CN by splitting on comma and taking the first part
    var cnPart = dn.split(',')[0];
    var cnValue = cnPart.replace('CN=', '').replace(/\\,/g, ',').trim();
    cns.push(cnValue);
    gs.info("CN: " + cnValue);
}

gs.info("All CNs: " + cns.join(", "));

Output:

AnkurBawiskar_0-1765353302779.png

 

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Hi @Ankur Bawiskar 

Expected CN outputs: I need to extract CN from all DN in the below format.

DUNN, KAREN {FLNA}
King, Alzra {FLNA}
02042174
Wilson, Brian J {FLNA}

Member string can have 12000 + DN , So I want a code that will work when member string is short OR too long.

@Chandra18 

try this

function extractCNs(members) {
    var cns = [];
    var dnArray = members.split('^');
    
    for (var i = 0; i < dnArray.length; i++) {
        var dn = dnArray[i].trim();
        if (!dn) continue;

        // Match CN=... until the next comma that is not part of the CN value
        var match = dn.match(/^CN=([^,]+(?:,[^=]+)*)/);
        if (match) {
            var cnValue = match[1].replace(/\\,/g, ',').trim();
            cns.push(cnValue.replace(",OU", ''));
        }
    }
    
    return cns;
}

// Example usage
var members = "CN=DUNN\\, KAREN {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=King\\, Alzra {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=02042174,OU=PCNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wilson\\, Brian J {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt";
var cns = extractCNs(members);

// Output each CN on a new line
for (var i = 0; i < cns.length; i++) {
    gs.info(cns[i]);
}

Output:

AnkurBawiskar_0-1765357089986.png

 

💡 If my response helped, please mark it as correct and close the thread 🔒— this helps future readers find the solution faster! 🙏

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Hi @Ankur Bawiskar 

Can we use same in Transform script??

sunilsargam
Tera Guru

Hi @Chandra18 ,

 

You can use the below logic which can give u the expected result.

var inputString = "CN=DUNN\\, KAREN {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=King\\, Alzra {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=02042174,OU=PCNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wilson\\, Brian J {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt";

var cnArray = [];
var regex = /CN=((?:\\,|[^,])*)(?=,OU=|$)/g;
var match;

while ((match = regex.exec(inputString)) !== null) {
    var cnValue = match[1]
        .replace(/\\,/g, ',') // unescape commas
        .trim();
    cnArray.push(cnValue);
}

gs.info("Extracted CNs:\n" + cnArray.join("\n"));

 

sunilsargam_0-1765356236924.png

If you find this answer useful, please mark it as solution accepted/helpful.