We're reclaiming inactive PDIs to keep them available for active builders. Learn what's changing, who's affected, and how to protect your work. Read More

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  ||  10x 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

@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  ||  10x 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  ||  10x ServiceNow MVP  ||  ServiceNow Community Leader

Hi @Ankur Bawiskar 

Can we use same in Transform script??