[RegEx] RegEx matched verkeerd*

Pagina: 1
Acties:

  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Ik ben bezig een parser te maken die tags uit een stuk tekst kan filteren. Nu kan ik daarvoor wel een groot aantal regular expressions maken, maar ik wilde eigenlijk 1 expressie voor alle mogelijk tags met parameters. Das makkelijker te maken (als het werkt), beter te onderhouden en makkelijker uit te breiden zonder significante performance-hit.

Ik heb deze expressie bedacht:
code:
1
\\[\s*(.+?)(?:\s*:\s*(.+?))?(?:\s+(\w+)(?:=(\w+))?)*\s*\]

(deze matcht dus nog niet op parameter-values tussen quotes)

En met de volgende string:
code:
1
[tag:veld param1=value1 param2=value2]

Hij matcht op deze string goed, maar hij geeft verkeerde submatches terug:
Submatch(0): tag
Submatch(1): veld
Submatch(2): param2
Submatch(3): value2

Wat ik wil, is dat ie met zo'n soort expressie alle parameters+values teruggeeft. Dat moet toch mogelijk zijn lijkt me :?

edit:
ik zie dat een modder de titel veranderd heeft. Nu weet men niet meer dat het om ASP gaat. Er worden nml ASP-specifieke elementen gebruikt (zoals "?:"), vandaar...

[ Voor 10% gewijzigd door _Thanatos_ op 10-01-2003 15:44 ]

日本!🎌


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Echt de verkeerde weg. Maak gewoon per tag een regular expressie. Regular expressies hebben een wanstaltige syntaxis die echt niet 1 2 3 aan de lezer openbaart wat allemaal matcht, het is dus handiger per tag een regular expressie te hebben, zodat wanneer een tag verandert je meteen die regular expressie kunt aanpassen zonder andere tags te vernaggelen. Dit werkt erg goed, ik gebruik dat zelf ook.

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • _Thanatos_
  • Registratie: Januari 2001
  • Laatst online: 22-06 10:32

_Thanatos_

Ja, en kaal

Topicstarter
Ik kan regular expressions best lezen. Maar het gaat er ook om dat er 1 regular expression komt die alle mogelijke tags in de vorm uit mijn beginpost kan opsporen en parameters kan teruggeven. Dat gezegd, moet je jezelf tegenspreken wanneer je zegt dat je beter een hele bult expressions kan maken, want dat vindt ik de leesbaarheid van de code zeker niet ten goede komen.

edit:
Ik heb een tussenoplossing, ik heb de regexp uitgebreid met matchen op velden met vreemdere tekens (zodat ie volgens mssql tussen [ en ] moet), en hij kan matchen op parameter-values tussen quotes met iedere gewenste tekst erin.
Tag:
code:
1
[tag_:[1veld] param1=value1 param2="doe maar wat tekst"]

Regular expression:
code:
1
2
\\[\s*([a-z0-9_]+?)(?:\s*:\s*((?:[a-z_][a-z0-9_]*?|\\[.+?\])))?
((?:\s+(?:\w+)(?:=(?:\w+|"(?:.|\n)+?"))?)*)\s*\]

en hij geeft terug:
Submatch 0: tag_
Submatch 1: [1veld]
Submatch 2: param1=value1 param2="doe maar wat tekst"

Dan kan ik in Submatch 2 weer een nieuwe regexp uitvoeren die de parameters met values teruggeeft...

[ Voor 48% gewijzigd door _Thanatos_ op 11-01-2003 18:41 . Reden: tussenoplossing ]

日本!🎌