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ą.
Nawiasem mówiąc, twoje wyrażenie regularne nie pasuje do tego, co chcesz dopasować. Dopasowuje pusty łańcuch, ale nie pasuje do '.11'. –
Naprawiono, że tak naprawdę nie było to konieczne :) – Goles
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.) –