Premiär! Fyndchans i SweClockers Månadens Drop
Permalänk
Medlem

Hjälp med reguljärt uttryck

Hej,

Har ett litet problem med att matcha några meningar tänkte se om ni kanske kan hjälpa mig då jag fortfarande håller på att lära mig.

Försöker hitta dessa meningar men vet inte hur jag kan göra så att det hittar ordet FR både i början och i slutet.

TF1 HD FR |FR| TF1 HD

Just nu använder jag mig av denna stringen, men då hittar den bara ordet FR i slutet:

(?=(TF)(\s*1)?(\s*HD)?\s*FR$)

Gör jag så här så hittar den inget:

(?=(TF)(\s*1)?(\s*HD)?^.*FR.*$)

Mvh
M89

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Geeks
Jobbar med data

Du kan lägga till | (det är inget L utan en pipe, vänster om Z knappen) efter första regulära uttrycket som fungerar. Sedan skriva en som matchar den andra raden. Har tyvärr inte tiden att skriva ett exempel som fungerar.

Ska den matcha vid flera tillfällen (om strängarna ser annorlunda ut) så behöver du bidrag med mer information, så vi kan utesluta vissa resultat.

Permalänk
Medlem

@M89: Ditt regexp ser alldeles för komplicerat ut för ditt testfall? För det exakta testfallet du har skulle jag använda något i stil med:

(TF1 HD FR|\|FR\| TF1 HD)

Permalänk
Medlem
Skrivet av lntg:

@M89: Ditt regexp ser alldeles för komplicerat ut för ditt testfall? För det exakta testfallet du har skulle jag använda något i stil med:

(TF1 HD FR|\|FR\| TF1 HD)

Det är ett alternativ men hade hoppats att man skulle kunna slippa använda OR operand och skriva meningen två gånger, jag blir då tvungen att skriva om en hel del kod.

Resultatet blir isåfall såhär vilket iofs fungerar:

(?=(TF)(\s*1)?(\s*HD)?\s*FR$)|(?=.*FR.*(TF)(\s*1)?(\s*HD)?$)

Glömde nämna att det handlar om en xml map som skall hitta olika kanal namn för samma kanal. Så här ser hela strängen ut:

<channel id="TF1 FR" title="(?=(TF)(\s*1)?(\s*HD)?\s*FR$)" strm=""/>

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem

Vad är det du kör för regex? Vill du alltså matcha rader som innehåller FR? Eller bara om det är i början med | runt och i slutet utan?

Detta kommer matcha vilken rad som helst som innehåller FR:
.*FR.*

Permalänk
Medlem
Skrivet av ulf5:

Vad är det du kör för regex? Vill du alltså matcha rader som innehåller FR? Eller bara om det är i början med | runt och i slutet utan?

Detta kommer matcha vilken rad som helst som innehåller FR:
.*FR.*

Jag vill att den matchar oavsett om ordet FR befinner sig i början av en mening eller i slutet.

Skickades från m.sweclockers.com

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem

@M89: Okej, så antingen i början eller i slutet, inte någon annanstans. Är raderna alltid endast tre tokens? Är pipes runt FR endast för om det är det första på raden? Detta blir som sagt ovan jättelätt om du tillåter OR.

Permalänk
Medlem
Skrivet av ulf5:

@M89: Okej, så antingen i början eller i slutet, inte någon annanstans. Är raderna alltid endast tre tokens? Är pipes runt FR endast för om det är det första på raden? Detta blir som sagt ovan jättelätt om du tillåter OR.

Ja precis endast i början eller i slutet, pipsen runt FR befinner sig endast i början av raden. Tanken är att slippa OR om det är möjligt

Skickades från m.sweclockers.com

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem

Inte superinsatt i regex, men tvivlar på att det går utan OR. Eftersom du bara säger att du behöver matcha FR, så ska du inte ha med resten av meningen i uttrycket. Testa det här:

/^\|FR.*|.*FR$/

Ska matcha en sträng som antingen börjar på |FR eller slutar på FR.

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk
Medlem
Skrivet av M89:

Ja precis endast i början eller i slutet, pipsen runt FR befinner sig endast i början av raden. Tanken är att slippa OR om det är möjligt

Skickades från m.sweclockers.com

Förutsatt att slutet på raden alltid innebär att det ska vara TF1 HD innan så funkar detta:

^\|?(TF1 HD )?FR.*

Kommer dock matcha några andra fall.

Skrivet av L'ombra:

Inte superinsatt i regex, men tvivlar på att det går utan OR. Eftersom du bara säger att du behöver matcha FR, så ska du inte ha med resten av meningen i uttrycket. Testa det här:

/^\|FR.*|.*FR$/

Ska matcha en sträng som antingen börjar på |FR eller slutar på FR.

Han vill inte ha med OR-operatorn av någon anledning. Såg att du nämnde det,

Permalänk
Medlem

Det ska fortfarande matcha resterande ord därav kan jag inte använda mig av (TF1)?

Skickades från m.sweclockers.com

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem

@M89: Menar du att du vill ha matchningen i första match-gruppen? Du får nog förtydliga lite exakt vad du vill göra och vad som ska matchas.

Permalänk
Medlem

Om det är XML, använd XPath istället?

Permalänk
Medlem
Skrivet av ulf5:

@M89: Menar du att du vill ha matchningen i första match-gruppen? Du får nog förtydliga lite exakt vad du vill göra och vad som ska matchas.

Jag ska försöka vara så tydlig som möjligt.

TF ska matchas alltid oavsett

FR ska matchas om det är i början av raden

FR ska matchas om det är i slutet av raden

Problemet är att jag inte är riktig säker på om det ens går att göra.

Den ska hitta dessa rader:

FR TF1 HD

eller

TF1 HD FR

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B

Permalänk
Medlem

Om du vill att det ska gå snabbt kan du använda en sax-parser istället för regex
https://en.wikipedia.org/wiki/Simple_API_for_XML

Permalänk
Medlem
Skrivet av M89:

Jag ska försöka vara så tydlig som möjligt.

TF ska matchas alltid oavsett

FR ska matchas om det är i början av raden

FR ska matchas om det är i slutet av raden

Ettan i TF1 då? Och HD?

Visa signatur

AMD Ryzen 7 5800X | 32 GB Corsair Vengeance 3200 MHz | ASUS TUF Geforce RTX 3080

Permalänk
Medlem
Skrivet av L'ombra:

Ettan i TF1 då? Och HD?

1 och HD matchas endast om de finns alltså inte nödvändigtvis ex. (\s*1)? (\s*HD)?

Skickades från m.sweclockers.com

Visa signatur

AMD 7800X3D | ASUS TUF X670E-PLUS | Corsair Vengeance DDR5 32GB EXPO | ASUS TUF 4090 OC 24GB |
Noctua NH-U12A | Corsair 4000D | Corsair AX1200W | Steelseries Apex 7 | Steelseries Sensei Ten | ASUS VG35VQ

https://github.com/Mariusz89B