[regex/(KOTLIN)] letters tegelijk includen en excluden

Pagina: 1
Acties:

Vraag


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
Hoe moet je tegelijk verschillende letters includen en excluden in regular expressions (in kotlin, maar wellicht maakt de taal niet uit omdat regex overal wordt gebruikt)?

Kotlin:
1
2
3
4
5
val str = "abcdefg"
val regularExpression = Regex("[a-d^c]")
val results = regularExpression.findAll(str)

for (result in results) println(result.value)


Output:

a
b
c
d

De regular expression is: [a-d^c]. Dit zou de reeks a-d zonder de c moeten printen, maar de c zit er wel in. Hoe krijg je de c eruit?

De gewenste output is dus:

a
b
d

[ Voor 4% gewijzigd door Salvatron op 25-10-2024 02:38 ]

Lucht en leegte, zegt Prediker, alles is leegte.

Beste antwoord (via Salvatron op 25-10-2024 03:23)


  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt niet eerst een range (a-d) opgeven en daarna 1 letter eruit willen pikken.
Het kan wel, met een negative lookahead: (?![c])[a-d]


Nu heb je een vrij korte range van maar 4 letters dus kun je gewoon [abd] (of [a-bd] maar dat is lelijk) gebruiken, maar stel dat je alles behalve d wil kun je dus [a-ce-g]
(of [a-ce-z]) gebruiken.

[ Voor 46% gewijzigd door RobIII op 25-10-2024 03:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Alle reacties


Acties:
  • Beste antwoord
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Je kunt niet eerst een range (a-d) opgeven en daarna 1 letter eruit willen pikken.
Het kan wel, met een negative lookahead: (?![c])[a-d]


Nu heb je een vrij korte range van maar 4 letters dus kun je gewoon [abd] (of [a-bd] maar dat is lelijk) gebruiken, maar stel dat je alles behalve d wil kun je dus [a-ce-g]
(of [a-ce-z]) gebruiken.

[ Voor 46% gewijzigd door RobIII op 25-10-2024 03:23 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
En als je alle letters wil behalve de c?

Waarom werkt dit dan niet:

"\\w^c"

Het gaat mij erom dat je bepaalde characters kunt excluden met regular expressions in een lange reeks. Het kan wel op andere manieren maar ik vraag me af hoe je dit in regular expressions voor elkaar kunt krijgen.

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • +1 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Salvatron schreef op vrijdag 25 oktober 2024 @ 03:04:
En als je alle letters wil behalve de c?
[^c] Mits je input alleen uit letters bestaat.
Anders: zie mijn edit. Omdat je zelf \w aangeeft: (?![c])\w

[ Voor 43% gewijzigd door RobIII op 25-10-2024 03:22 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Salvatron
  • Registratie: April 2003
  • Niet online

Salvatron

Dispereert niet

Topicstarter
RobIII schreef op vrijdag 25 oktober 2024 @ 02:55:
Je kunt niet eerst een range (a-d) opgeven en daarna 1 letter eruit willen pikken.
Het kan wel, met een negative lookahead: (?:(?![c])[a-d])


Nu heb je een vrij korte range van maar 4 letters dus kun je gewoon [abd] (of [a-bd] maar dat is lelijk) gebruiken, maar stel dat je alles behalve d wil kun je dus [a-ce-g]
(of [a-ce-z]) gebruiken.
Ja, deze doet het:

Output:

a
b
d

Zo werkt hij ook:

(?![c])[a-d]

[ Voor 66% gewijzigd door Salvatron op 25-10-2024 03:21 ]

Lucht en leegte, zegt Prediker, alles is leegte.


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Ja, was nog een restantje van mijn test :P

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Antwoord is natuurlijk al gegeven, en wellicht subjectief, maar ik word in het algemeen zelf blijer van zaken die enkel allowlist XOR blocklist zijn, en niet een mix. :)

Maar om deze waarom vraag nog te beantwoorden: De regexes met ^ verderop in de charlist zijn ook syntactisch juist, want het is natuurlijk ook een use case om soms juist op het letterlijke dakje te willen matchen.
Blijkbaar hebben de ontwerpers die use case belangrijker gevonden dan mix allow/block qua syntax, en daarin geef ik ze dus gelijk. ;)

{signature}

Pagina: 1