c # - Stringmanipulation med regex

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har streng som CAIRN-CA-200 og ønsker at matche CA med den streng og ønsker at erstatte
det med string.empty men det bør ikke erstattes af CAIRN, det skal erstatte til CA som
er forbundet med hypen (-). Denne streng kan også være CAIRN CA 200, så skal den også matches
med kun CA-ord, bør det ikke matches med CAIRN, hvilket betyder at streng skal matches
med kun for hele ordet som her er det CA og bør ikke matche til substring af nogen
ord. Hvordan opnår man det?


En ting er der, at før og efter det ord vil der ikke være nogen alfabetisk eller
numerisk karakter som her er bindestreg.


Så en løsning kan ses, hvis start og slutning af ordet ikke er alfabet eller numerisk
så skal det ord matches, men jeg ved ikke hvordan man skriver regex for det. Det er
Hvordan matcher du ordet, der er vedlagt karakteren, der ikke er alfabet eller numerisk?


Jeg prøvede med sagen som streng regex ="^[a-zA-Z0-9\_]" + "CA" + "^[a-zA-Z0-9\_]", men det virker ikke.

Bedste reference


resultString = Regex.Replace(subjectString, @"CA", "");


erstatter CA med ingenting, hvis det findes som et helt ord.  er et ord grænseranker, der kun matcher ved starten eller slutningen af ​​et alfanumerisk 'ord'.


Din regex fejler fordi ^ er placeret uden for tegneserien, hvilket betyder 'match i starten af ​​strengen'.


Hvis du også vil erstatte de omgivende tegn, kan du bruge


 "[^a-zA-Z0-9\_]" + "CA" + "[^a-zA-Z0-9\_]"


Inde i en karakterklasse negerer ^ indholdet af klassen, som du også havde det til. Bemærk at dette vil mislykkes, hvis CA er ved starten eller slutningen af ​​strengen.

Andre referencer 1


var r = "CA";
var source = "CAIRN-CA-200";
var result = Regex.Replace(source, "([^\w\d\_])" + r + "\1", "$1$1");


Dette vil erstatte enhver R, der ikke er omgivet af a-z, 0-9 eller \_ så længe de passer, giver følgende mulighed for forskellige omgange og vil matche i starten eller slutningen af ​​snoren


var r = "CA";
var source = "CAIRN-CA-200";
var result = Regex.Replace(source, "([^\w\d\_]|^)" + r + "([^\w\d\_]|$)", "$1$2");


Her er min Linqpad test for den anden Regex.


void Main()
{
    Rep("CAIRN-CA-200", "CA").Dump();
    Rep("CAIRN", "CA").Dump();
    Rep("CAIRN CA 200", "CA").Dump();
    Rep("CA 200", "CA").Dump();
    Rep("CA", "CA").Dump();
    Rep("CAIRN CA", "CA").Dump();

}

// Define other methods and classes here
string Rep(string s, string r)
{
    return Regex.Replace(s, "([^\w\d\_]|^)" + r + "([^\w\d\_]|$)", "$1$2");
}


Og resultaterne


CAIRN-CA-200 => CAIRN--200
CAIRN => CAIRN
CAIRN CA 200 => CAIRN  200
CA 200 => 200
CA =>
CAIRN CA => CAIRN