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

@Chandra18 

I agree with @sunilsargam 

the variable has \\ because tool made assumption that its a special escape character

 

Still if you are considering to use only \ in your variable members,  here is the updated script:

 

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=Worley\, Dee Dee {Quaker},OU=UsIlChicago1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Patterson\, Erica {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Schwerdt\, Brandon {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=GRANGER\, JEFF {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=McConn\, Jay {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Lemieux\, Andre {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Uwariraye\, Patrick {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Qually\, Karla {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Stymest\, Steve {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=BROWNING\, STEVEN M {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Torres\, Andrew {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Huntley\, Joseph {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Lee\, Howard {PEP},OU=PepsiCo,OU=People,DC=corp,DC=pep,DC=pvt^CN=de anda\, lorraine {quaker},OU=legacyQkrOrg,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Reed\, Billy R {FLNA},OU=UsArJonesboro1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Yamamoto\, Brent {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Cropo\, Tom {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Green\, Jim {Quaker},OU=UsInIndianapolis2,OU=QuakerRemote,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^CN=Kanady\, Leland {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Taylor\, John {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Park\, Joshua {FLNA},OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Inverarity\, Jeff {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Pulver\, Alicia {FLNA},OU=UsCtDayville1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Denney\, Michael {FLNA},OU=Descoped,OU=Terminated,OU=People,DC=corp,DC=pep,DC=pvt^CN=Lynch\, Jacob {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Graves\, Shaunn {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Herrera\, Jose {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Tarango\, Eliseo {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Ochoa\, Enrique {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Gordon\, Cristhoper {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Luffman\, Kris {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Shape\, Barry {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Blodgett\, Earl {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Setton\, Shane {Quaker},OU=Quaker,OU=People,DC=corp,DC=pep,DC=pvt^CN=Leonard\, Charles {Quaker},OU=Quaker,OU=People,DC=corp,DC=pep,DC=pvt^CN=Joseph\, Christopher {Quaker},OU=Quaker,OU=People,DC=corp,DC=pep,DC=pvt^CN=Johnson\, Sammy {Quaker},OU=Quaker,OU=People,DC=corp,DC=pep,DC=pvt^CN=Laberge\, Chris {FLNA},OU=UsCtDayville1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=vargason\, jon {quaker},OU=UsIaCedarRapids1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Compton\, Holly {PBC},OU=Descoped,OU=Terminated,OU=People,DC=corp,DC=pep,DC=pvt^CN=Bell\, Maurice {FLNA},OU=UsGaKathleen1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Fulton\, Melva L {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Carchidi\, Heather {FLNA},OU=UsCtDayville1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Stewart\, Marcel {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Malczyk\, Kevin J {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Morton\, Jeremy R {FLNA},OU=UsTxIrving2,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=MAGANA\, MIREYA {QUAKER},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=LORENTZ\, MAUREEN {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Munsell\, Jerry {PNB},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Kelly\, Frances {Quaker},OU=UsIaCedarRapids1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Rhodes\, Robert {Quaker},OU=UsIaCedarRapids1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Nichols\, David {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=SNIPES\, LLOYD {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Meech\, Murray {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Benton\, Dennis F {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Satterwhite\, Tim {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Polley\, Jeff {PBC},OU=UsAzPhoenix1,OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Reed\, Joshua W {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Sanzi\, Gene {FLNA},OU=UsCtDayville1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Shopteese\, Russell L {FLNA},OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Siegle\, Laurie A {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wilson\, Dan {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Saefong\, Meuy {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Wooldridge\, Conni A {FLNA},OU=UsGaKathleen1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Rios\, Nellie {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Dube\, Michael {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Peatross\, Stefanie {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Newman\, Nancy {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Weston\, Larry {FLNA},OU=UsVaLynchburg1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Morales\, Rosa {Quaker},OU=PCNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Oettgen\, Mike {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Frost\, John {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Keating\, James {PNB},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Medere\, Mark {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt^CN=Chapman\, Troy {Quaker},OU=UsInIndianapolis2,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=02040087,OU=Quaker,OU=People,DC=corp,DC=pep,DC=pvt^CN=Bengston\, Michael J {FLNA},OU=UsCaModesto2,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Emery\, Rhoda M {FLNA},OU=UsTxPlano1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Glaude\, Lance {FLNA},OU=UsCtDayville1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=Miller\, Diana {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Heinz\, Paul {Quaker},OU=UsAzTolleson1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=HAUSER\, LIZ {FLNA},OU=CaOnMississauga1,OU=FLNA,OU=People,DC=corp,DC=pep,DC=pvt^CN=vandohlah\, amron {quaker},OU=UsIaCedarRapids1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Welton\, Bridget {Quaker},OU=UsIaCedarRapids1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Etten\, Lynn {Quaker},OU=UsIaCedarRapids1,OU=QuakerRemote,OU=People,DC=corp,DC=pep,DC=pvt^CN=Aker\, Timothy {PBC},OU=PBG,OU=People,DC=corp,DC=pep,DC=pvt" ;  // etc. you can keep appending

// Split each DN by ^

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

for (var i = 0; i < dnArray.length; i++) {

    var dn = dnArray[i].trim();

    if (!dn)

        continue;

    // find start of CN value

    var start = dn.indexOf("CN=");

    if (start === -1)

        continue;

    start += 3; // skip "CN="

    // CN ends at the first ",OU=" (works even if there are commas in the name)

    var end = dn.indexOf(",OU=");

    if (end === -1)

        end = dn.length;

    var cnValue = dn.substring(start, end).trim();

    // if backslashes are actually present in the real data, unescape them:

    cnValue = cnValue.replace(/\\,/g, ",");

    gs.info("Chandra@@@: CNmatch: " + cnValue);

}

 

Result:

 

Mohammed8_0-1765362965144.png

 

 

Thanks and Regards,

Mohammed Zakir

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??