2011-05-31 8 views
5

Jestem nowy na Lua funkcji regex równoważności, muszę napisać następujące wyrażenie regularne, która powinna być zgodna z liczb dziesiętnychJak wpisać to wyrażenie regularne w języku Lua?

\b[0-9]*.\b[0-9]*(?!]) 

zasadzie pasuje numerów w formacie dziesiętnym (np: 1, 1.1, 0.1, 0.11), które nie kończą się na "]", próbowałem napisać wyrażenie podobne do tego z Luą używając string.gmatch, ale jestem dość niedoświadczony z wyrażeniami pasującymi Lua ...

Dzięki!

+0

Nawiasem mówiąc, twoje wyrażenie regularne nie pasuje do tego, co chcesz dopasować. Dopasowuje pusty łańcuch, ale nie pasuje do '.11'. –

+0

Naprawiono, że tak naprawdę nie było to konieczne :) – Goles

+0

To także nie pasuje do '0.11' ... chcesz' '' zamiast '?' Po twoim drugim '[0-9]', myślę. (A może jednym z '*' be a '+', aby uniknąć dopasowania pusty ciąg.) –

Odpowiedz

5

Lua nie ma wyrażenia regularne, głównie dlatego, że pełny regularne biblioteka ekspresji byłaby większa niż sama Lua.

Co Lua posiada zamiast są matching patterns, które są sposobem mniej potężne (ale wciąż wystarczająca dla wielu przypadków użycia):

  • Nie ma „słowo granica” dopasowujący,
  • ma alternatywy,
  • a także bez uprzedzeń lub podobnych.

Myślę, że nie ma wzoru Lua, który pasowałby do każdego możliwego wystąpienia twojego łańcucha, i żadnego innego, co oznacza, że ​​musisz jakoś to obejść.

Wzór zaproponowany przez Stuarta, %d*%.?%d*, dopasowuje wszystkie liczby dziesiętne (z kropką lub bez), ale pasuje również do pustego łańcucha, co nie jest całkiem użyteczne. %d+%.?%d* dopasowuje wszystkie liczby dziesiętne z co najmniej jedną cyfrą przed kropką (lub bez kropki), %d*%d.?%d+ dopasowuje wszystkie liczby dziesiętne z co najmniej jedną cyfrą po kropce (lub bez kropki). %.%d+ dopasowuje liczby dziesiętne bez cyfry przed kropką.

Prostym rozwiązaniem byłoby przeszukiwanie więcej niż jednego z tych wzorów (na przykład zarówno %d+%.?%d*, jak i %.%d+) i łączenie wyników. Następnie spójrz na miejsca, w których je znalazłeś i sprawdź, czy za nimi znajduje się znak "]".


Eksperymentowałem trochę z frontier pattern.

Wzorzec %f[%.%d]%d*%.?%d*%f[^%.%d%]] dopasowuje wszystkie liczby dziesiętne poprzedzone czymś, co nie jest ani cyfrą ani kropką (lub przez nic), a po niej występuje coś, co nie jest ani cyfrą, ani kropką (lub nicością). Jest również zgodny z pojedynczą kropką.

+1

Jest to [wzór granicy] (http://lua-users.org/wiki/FrontierPattern), który jest "nieoficjalny i nieudokumentowany" w 5.1, ale będzie w Lua 5.2. – jpjacobs

+0

Czytałem o tym, ale jak wyglądałoby wyrażenie przy użyciu wspomnianego wcześniej wzoru granicy? – Goles

+0

@jpjacobs: Dzięki, wygląda ładnie. Dodałem przykład, używając tego, ale nadal nie jest tam. –

1

"%d*%.?%d+" dopasuje wszystkie takie liczby w formacie dziesiętnym (zauważ, że będzie brakować jakichkolwiek podpisanych cyfr, takich jak -1.1 lub +3.14). Musisz wymyślić inne rozwiązanie, aby uniknąć przypadków, które kończą się ], takie jak usuwanie ich z łańcucha przed patrząc na numery:

local pattern = "%d*%.?%d+" 
local clean = string.gsub(orig ,pattern .. "%]", "") 
return string.gmatch(clean, pattern) 
+0

Czy twój wzór nie pasowałby również do pustego napisu? –

+0

D'oh, wszystkie zostały złapane pasujące do regex OP I zapomniałem to sprawdzić. –