login  Naam:   Wachtwoord: 
Registreer je!
 Forum

Regex combineren (Opgelost)

Offline Ontani - 12/01/2008 23:12
Avatar van OntaniGouden medailleGouden medailleGouden medailleGouden medaille

-1
Ik heb 2 reguliere expressies.
die eigenlijk bijna hetzelfde doen en perfect te combineren zijn, maar ik ben er geen held in en krijg het daardoor ook niet voor elkaar:
  1. Eerste : /(\d{1,2}):(\d{1,2}) ([A-z0-9:]*) [\d ]*: (.*) hit (.*) at location (.*) for \d/is
  2. Tweede : /(\d{1,2}):(\d{1,2}) ([A-z0-9:]*) [\d ]*: (.*) killed (.*) by (.*)/is

13 antwoorden

Gesponsorde links
Offline BramBo - 12/01/2008 23:15
Avatar van BramBo JS gevorderde Zou je de output kunnen geven, dus de 2 mogelijkheden van de zinnen. Dit is iets makkelijker regexp schrijven 
Offline Ontani - 12/01/2008 23:46
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
  1. 6:59 hit: 0 1 8 50 34: Attacker hit Victim at location 8 for 50
  2. 6:59 Kill: 0 1 10: Attacker killed Victim by MOD_MSG90A1_SNIPER_RIFLE


zijn 2 voorbeelden
Offline Stijn - 12/01/2008 23:46
Avatar van Stijn PHP expert Je kan gebruik maken van het OR teken

  1. /(\d{1,2}):(\d{1,2}) ([A-z0-9:]*) [\d ]*: (.*) ((hit (.*) at location (.*) for \d)|(killed (.*) by (.*)))/is


$result[6] = hit ... at location ... for x
$result[7] = killed ... by ...
Offline Ontani - 13/01/2008 00:09
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
da is nie echt wa ik moet hebben...

ik zou de dingen die tussen () staan ook in variabelen moeten hebben.
en dus niet volledig zoals bij uw voorbeeld het geval is.

ik dacht dat zoiets ging met: hit|killed maar dat wilt nie lukken
Offline BramBo - 13/01/2008 00:25
Avatar van BramBo JS gevorderde
  1. ^(\d{1,2}):(\d{1,2})\s(?>[\w:]+)(?>([\s\d]+)):\s([^\s]+)\s(?>\w+)\s([^\s]+)\s(?>\w+)\s(.+)$


Group 1: Uur
Group 2: Minuten
Group 3: Cijfers.. (dus na hit/kill)
Group 4: Attacker
Group 5: Victim
Group 6: "located x for x" || Wapen
Offline Ontani - 13/01/2008 00:30 (laatste wijziging 13/01/2008 00:30)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
dit haat ik dus aan regex é, bedankt BramBo da werkt perfect, maar kan je dit ook doen met mijn versie. ik begrijp er namelijk niks meer van en vond mijn versie veel overzichtelijker. waarom verrander je die .* door \w ?
Offline vinTage - 13/01/2008 00:37
Avatar van vinTage Nieuw lid omdat .* voor alles staat en w alleen voor getallen en letters

http://www.regular-expressions.info/reference.html
Offline BramBo - 13/01/2008 00:42 (laatste wijziging 13/01/2008 00:43)
Avatar van BramBo JS gevorderde Zo zijn de groups stricter afgezet. \w+ komt op 't zelfde neer in jou geval als .* hoewel * 0 of meer is en + altijd iets is er verder weinig verschil.

En wanneer je | gaat gebruiken met specifieke woorden vind ik het overdreven lang worden aangezien je dan een soort cases ga definiëren, terwijl \w altijd oke is.

Verder komt er een aantal keer een lookahead in voor.
Alles te vinden hier: http://www.regu...round.html

Maar om 't laatste stukje van je regexp te herzien, dien je het laatste stukje aan te passen naar:
  1. (?>hit|killed) (.+) (?>by|at location) ([\w\d\s]+)$

dus( hit (.*) at location (.*) for \d )
Offline Ontani - 13/01/2008 00:52 (laatste wijziging 13/01/2008 00:58)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
oké ik begin uw versie al beter te begrijpen en heb dan ook uw eerste versie gebruikt. om een of andere reden wordt die eerste hit: of Kill: niet uitgelezen terwijl er toch in de regex staat: (?>[\w:]+).
Ook zou ik graag achteraan niet volledig die "location 2048 for 15" hebben maar enkel het eerste cijfer die 2048 dus.

huidige regex:
  1. /^(\d{1,2}):(\d{1,2})\s(?>[\w:]+)(?>([\s\d]+)):\s([^\s]+)\s(?>\w+)\s([^\s]+)\s(?>\w+)\s(.+)$/


@ . vervangen door \w, die namen kunnen ook alle karakters bevatten, en niet enkel letters of cijfers dus ik denk dat .+ de beste oplossing is.
Offline BramBo - 13/01/2008 01:31 (laatste wijziging 13/01/2008 01:39)
Avatar van BramBo JS gevorderde
  1. ^(\d{1,2}):(\d{1,2})\s(?>[\w:]+)(?>([\s\d]+)):\s([^\s]+)\s(?>\w+)\s([^\s]+)\s\w+[\s\w]*?\s((?>[\d]+)|(?>[\w]+?$))[\w\s\d]*?$

Dan wordt 't iets uitgebreider 

het belangrijkste stukje :
  1. ((?>[\d]+)|(?>[\w]+?$))

dit is dus of een woord dat het einde van de regel betekent of een getal, met voorgaande een eventueel woord en gevolgd door 0 tot meer andere tekens er achter...


edit:
@ edit Ontani: .+ kan beter worden [^\s], dus geen spatie aangezien spaties het in zo'n gevoelig regexp het nogal kunnen vernaaien voor je. je kant [^\s] ook natuurlijk nog uitbreiden met de characters die niet voor mogen komen in de naam
Offline Ontani - 13/01/2008 01:43
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
er zijn echt geen restricties op de naam, zelfs spaties zijn toegelaten.
Offline BramBo - 13/01/2008 01:52 (laatste wijziging 13/01/2008 02:06)
Avatar van BramBo JS gevorderde Dan gaat 't regexpje niet werken.. Ook niet met .+

herzie 't naar:
  1. ^(\d{1,2}):(\d{1,2})\s(?>[\w:]+)(?>([\s\d]+)):\s(.+?)\s(?>killed|hit)\s(.+?)\s(?>(?>by)|(?>at location))+\s((?>[\d]+)|(?>[\w]+?$))[\w\s\d]*?$


nog meer verassingen ?  
Offline Ontani - 13/01/2008 03:01 (laatste wijziging 13/01/2008 03:03)
Avatar van Ontani Gouden medailleGouden medailleGouden medailleGouden medaille

-1
Normaal niet, maar de 3e group wilt niet matchen: (?>[\w:]+) dus.
Dit zou hit: of Kill: moeten teruggeven

Edit: oké probleem is opgelost, bedankt voor de hulp
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.286s