ugrás a tartalomhoz

Regex egyezés előtti szöveg - MEGOLDVA

csabessz47 · 2015. Feb. 10. (K), 10.23
Sziasztok,

Regex kifejezésekkel elakadtam, és sajnos rákeresni sem nagyon tudok a problémára, habár már órákat vacakoltam vele.
Remélem itt a rókák közül tud segíteni valaki.

A teszt szöveg:
5 valami
55 valami
szöveg 5 valami szöveg

5 x valami
55 x valami
szöveg 5 x valami szöveg

valami
szöveg valami


Ebből kéne kinyernem, hogy hányszor van a valami egy sorban (egyszerre mindig csak 1 sort kell majd vizsgálni, ez tartalmazza az összes esetet).
Az első 2 variációra megvan a megoldás:
((?<counter>(\d+)) (|x ))valami
Viszont a 3. esetben (amikor nincs szám) 1-et kéne alkalmazni.
De már az is nagy segítség lenne, ha lenne olyan minta, ami csak az utolsó 2 sorra egyezik. Negatív lookeaheaddel próbálkoztam, de nem sok sikerrel, ez rátalál az összes sorra:
(?!(\d+) (|x ))valami
Van ötletetek, hogy hogyan lehetne megoldani?

Köszönöm előre is

Itt lehet látni színezgetve:
https://regex101.com/r/hD2hS0/3
 
1

Első megoldás

csabessz47 · 2015. Feb. 10. (K), 10.58
Közben olvasgattam, aztán a lookbehind pontosan azt tenné amit szeretnék, viszont fix hosszúságú kell.
Ezzel sikerült:
(?<!\d )(?<!\d\d )(?<!\d x )(?<!\d\d x )valami
De ez eléggé hack :)
Ha tudtok esetleg egy univerzálisabb megoldást, kérlek ne tartsátok magatokban.
4

Érdemes átnézni a php

Hidvégi Gábor · 2015. Feb. 10. (K), 11.36
Figyelmetlen voltam, bár a fogalmazásod sem egyértelmű. Tehát az a feladat, hogy a "valami" karakterlánc előtti számot megmondd.
5

Igen

csabessz47 · 2015. Feb. 10. (K), 11.55
Igen, ez lenne a legjobb.
Aztán ahol nincs érték de van egyezés, akkor majd utólag 1-et rakok be.

Az egésznek a lényege, hogy db-ből az összes mintával megnéz egy stringet, és az egyezések alapján tulajdonságokat ad egy objektumnak.

Tehát a különbség aközött, hogy a számot 1 mintával kitalálja, és hogy a meglévő számos minta mellé felveszek egy újat ami CSAK a szám nélkülire illeszkedik a végeredménynél nem számít.

Ezért próbáltam úgy fogalmazni, hogy mindkettő megoldás jó lenne, de sajnos magamtól egyik sem ment.
2

((\d+)\s+(?:x\s+)?)?(valami)

szabo.b.gabor · 2015. Feb. 10. (K), 11.07
((\d+)\s+(?:x\s+)?)?(valami)
3

Ez tetszik

csabessz47 · 2015. Feb. 10. (K), 11.30
Ezzel már sikerül megoldani, köszönöm.
Kicsit szigorítani kell rajta, meg a számot elkapni mondjuk egy counterbe.
Aztán ha nincs counter akkor php majd 1-et pótol be utólag :)

((?<counter>(\d+))\s(?:x\s)?)?valami

Köszönöm.
6

szívesen

szabo.b.gabor · 2015. Feb. 10. (K), 13.44
szívesen