Avatar billede erik_a Novice
07. september 2018 - 12:18 Der er 4 kommentarer og
1 løsning

preg_split og regulære udtryk

Hej

Jeg har en udfordring med et regulært udtryk, hvilket jeg sgu ikke er ret skarp i.
Nå, men udfordringen er at jeg vil have splittet en lang streng efter hvert A, V, I, L, G og R medmindre den IKKE efterfølges af B, C, D, E, H, I, J, K, M, N, O, Q, R, S, T, U, V, W, X, Y eller X
og tilslut returneres hele lortet i et array

Min funktion er her:
function SplitElastase($string){
    $Split = preg_split( "/(A|V|I|L|G|R)(?!B|C|D|E|H|I|J|K|M|N|O|Q|R|S|T|U|V|W|X|Y|X)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY);
    $i=0;
    print_r($Split)."<br><br>";
    foreach ($Split as &$value) {
        if($value <> "A" && $value <> "V" && $value <> "I" && $value <> "L" && $value <> "G" && $value <> "R"){
            $array[$i] = $value;
        }else{
            $array[$i] = $array[$i].$value;
            $i++;
        }
    }
    return $array;
}

Desværre ser det ud til at den gør det forkert.

Hvis nogle har lyst til at forsøge sig, så er et eksempal på en streng her:
MRSWVVGARLLLLLQLVLVLGAVRLPPCTDPRHCTDPPRYTPDWPSLDSRPLPAWFDEAKFGVFVHWGVFSVPAWGSEWFWWHWQGEKLPQYESFMKENYPPDFSYADFGPRFTARFFNPDSWADLFKAAGAKYVVLTTKHHEGYTNWPSPVSWNWNSKDVGPHRDLVGELGTAIRKRNIRYGLYHSLLEWFHPLYLRDKKNGFKTQYFVNAKTMPELYDLVNRYKPDLIWSDGEWECPDTYWNSTDFLAWLYNDSPVKDEVVVNDRWGQNCSCHHGGYYNCKDKFQPETLPDHKWEMCTSIDQRSWGYRRDMEMADITNESTIISELVQTVSLGGNYLLNVGPTKDGLIVPIFQERLLAVGKWLSINGEAIYASKPWRVQSEKNSVWYTSKGLAVYAILLHWPEYGILSLISPIATSTTKVTMLGIQKDLKWSLNPSGKGLLVFLPQLPPAALPTEFAWTIKLTGVK
Avatar billede erik_a Novice
07. september 2018 - 13:08 #1
Rettelse:
Se bort fra IKKE:

Vi splitter efter hvert A, V, I, L, G og R medmindre de efterfølges af et B, C, D, E, H, I, J, K, M, N, O, Q, R, S, T, U, V, W, X, Y eller X
Streng: PSLDSRPLPAWFDEAKFGV

PSLDSRP
L
P
A
W
FDEAKFGV

Den splitter efter A, men da A efterfølges af W bør den ikke splitte.
Avatar billede Slater Ekspert
07. september 2018 - 13:17 #2
Med mindre jeg misforstår opgaven, bør det være så simpelt som:

preg_match_all('/(.*?[AVILGR])(?=[^BCDEHIJKMNOQRSTUVWXYX]|$)/', $string, $matches);

$result = $matches[0];

var_dump($result);
Avatar billede erik_a Novice
07. september 2018 - 14:06 #3
Hej Slater

Uhh, det er tæt på, dvs. den gør alt rigtigt, men jeg får ikke slutningen med:
MRSWVVGARLLLLLQLVLVLGAVRLPPCTDPRHCTDPPRYTPDWPSLDSRPLPAWFDEAKFGVFVHWGVFSVPAWGSEWFWWHWQGEKLPQYESFMKENY
PPDFSYADFGPRFTARFFNPDSWADLFKAAGAKYVVLTTKHHEGYTNWPSPVSWNWNSKDVGPHRDLVGELGTAIRKRNIRYGLYHSLLEWFHPLYLRDK
KNGFKTQYFVNAKTMPELYDLVNRYKPDLIWSDGEWECPDTYWNSTDFLAWLYNDSPVKDEVVVNDRWGQNCSCHHGGYYNCKDKFQPETLPDHKWEMCT
SIDQRSWGYRRDMEMADITNESTIISELVQTVSLGGNYLLNVGPTKDGLIVPIFQERLLAVGKWLSINGEAIYASKPWRVQSEKNSVWYTSKGLAVYAIL
LHWPEYGILSLISPIATSTTKVTMLGIQKDLKWSLNPSGKGLLVFLPQLPPAALPTEFAWTIKLTGVK

Resultatet:

array(89) {[0]=>string(4) "MRSW"[1]=>string(1) "V"[2]=>string(5) "VGARL"[3]=>string(1) "L"[4]=>string(1) "L"[5]=>string(1) "L"[6]=>string(3) "LQL"[7]=>string(1) "V"[8]=>string(1) "L"[9]=>string(1) "V"[10]=>string(3) "LGA"[11]=>string(3) "VRL"[12]=>string(1) "P"[13]=>string(11) "PCTDPRHCTDP"[14]=>string(7) "PRYTPDW"[15]=>string(7) "PSLDSRP"[16]=>string(1) "L"[17]=>string(1) "P"[18]=>string(2) "AW"[19]=>string(8) "FDEAKFGV"[20]=>string(1) "F"[21]=>string(5) "VHWGV"[22]=>string(3) "FSV"[23]=>string(1) "P"[24]=>string(6) "AWGSEW"[25]=>string(10) "FWWHWQGEKL"[26]=>string(6) "PQYESF"[27]=>string(6) "MKENYP"[28]=>string(16) "PDFSYADFGPRFTARF"[29]=>string(6) "FNPDSW"[30]=>string(3) "ADL"[31]=>string(3) "FKA"[32]=>string(6) "AGAKYV"[33]=>string(1) "V"[34]=>string(12) "LTTKHHEGYTNW"[35]=>string(3) "PSP"[36]=>string(16) "VSWNWNSKDVGPHRDL"[37]=>string(7) "VGELGTA"[38]=>string(14) "IRKRNIRYGLYHSL"[39]=>string(3) "LEW"[40]=>string(3) "FHP"[41]=>string(15) "LYLRDKKNGFKTQYF"[42]=>string(6) "VNAKTM"[43]=>string(6) "PELYDL"[44]=>string(8) "VNRYKPDL"[45]=>string(19) "IWSDGEWECPDTYWNSTDF"[46]=>string(1) "L"[47]=>string(2) "AW"[48]=>string(6) "LYNDSP"[49]=>string(5) "VKDEV"[50]=>string(1) "V"[51]=>string(28) "VNDRWGQNCSCHHGGYYNCKDKFQPETL"[52]=>string(24) "PDHKWEMCTSIDQRSWGYRRDMEM"[53]=>string(9) "ADITNESTI"[54]=>string(4) "ISEL"[55]=>string(11) "VQTVSLGGNYL"[56]=>string(10) "LNVGPTKDGL"[57]=>string(1) "I"[58]=>string(1) "V"[59]=>string(1) "P"[60]=>string(1) "I"[61]=>string(5) "FQERL"[62]=>string(1) "L"[63]=>string(1) "A"[64]=>string(4) "VGKW"[65]=>string(7) "LSINGEA"[66]=>string(23) "IYASKPWRVQSEKNSVWYTSKGL"[67]=>string(1) "A"[68]=>string(3) "VYA"[69]=>string(1) "I"[70]=>string(1) "L"[71]=>string(3) "LHW"[72]=>string(5) "PEYGI"[73]=>string(3) "LSL"[74]=>string(3) "ISP"[75]=>string(1) "I"[76]=>string(9) "ATSTTKVTM"[77]=>string(18) "LGIQKDLKWSLNPSGKGL"[78]=>string(1) "L"[79]=>string(1) "V"[80]=>string(1) "F"[81]=>string(1) "L"[82]=>string(3) "PQL"[83]=>string(1) "P"[84]=>string(1) "P"[85]=>string(1) "A"[86]=>string(1) "A"[87]=>string(1) "L"[88]=>string(4) "PTEF" }

Men mangler AWTIKLTGVK
Avatar billede Slater Ekspert
07. september 2018 - 15:11 #4
Ah ja, jeg testede med en streng der sluttede på "A", hvor den virkede.

Lidt bedre er dette:
/(.*?(?>[AVILGR]|$))(?=[^BCDEHIJKMNOQRSTUVWXYX]|$)/

- den får dog en tom match tilbage til sidst, fordi den accepterer en 0 tegn lang streng som et match, så længe den afslutter linjen. Ikke perfekt, men du kan nemt fjerne det sidste tomme match, eventuelt med array_pop().

Jeg har desværre ikke lige tid til at tænke mere over det lige nu.
Avatar billede erik_a Novice
07. september 2018 - 15:44 #5
Fårk du er sej :-)
Tusind tak, lige den løsning jeg skal bruge, pyt med det ekstra i array, det er lige meget.
Man kunne engang give point her, 1000 til dig !
Ha en go weekend...

Regulære udtryk, men burde nok lære det...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester