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.

1 ACCEPTED SOLUTION

@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

View solution in original post

17 REPLIES 17

sunilsargam
Kilo Sage

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.

Hi @sunilsargam 

in testing why are you taking two backslash (\\,) but in my field value it is single one (\,)

CN=DUNN\\, KAREN {FLNA}

 it should work for with single backslash .

CN=DUNN\, KAREN {FLNA}
 

Hey @Chandra18 ,

 

In JavaScript/ServiceNow script, a single backslash \ is an escape character inside string literals and regex literals.

So to represent a literal backslash in code, you must write \\.

 

Try to execute the above script with your dynamic output. 

 

Let me know if this works or not

Thank you

Sunil Sargam