2010-05-25 10 views
5

Użyłem RegExp rzucić trochę razy, ale nadal daleko do bycia ekspertem. Tym razem chcę sprawdzić poprawność formuły (lub wyrażenia matematycznego) przez regExp. Najtrudniejszą częścią jest sprawdzenie poprawności nawiasów początkowych i końcowych w formule.
Wydaje mi się, że w internecie jest jakaś próbka, ale nie mogłem jej znaleźć. Czy ktoś może zamieścić link do takiego przykładu? lub pomóc mi w jakiś inny sposób?RegExp, aby sprawdzić poprawność formuły (wyrażenie matematyczne z dopasowanymi nawiasami)?

Odpowiedz

5

Języki z dopasowanych zagnieżdżonych nawiasów nie są regularne językach, a zatem nie mogą być uznane przez wyrażeń regularnych. Niektóre implementacje wyrażenia regularnego (na przykład w środowisku .NET) mają rozszerzenia do radzenia sobie z tym, ale to naprawdę nie jest przyjemne w pracy. Sugeruję więc użycie dostępnego parsera lub samodzielne zaimplementowanie prostego parsera (ze względu na zabawę).

Dla rozszerzenia w realizacji .NET zobaczyć MSDN on balancing groups.

+0

Byłem używać tego Regexxp jako wzorzec w schemacie XML do sprawdzania wartości atrybutu. Wszelkie sugestie w tym kontekście? – WSK

+0

* ale to naprawdę nie jest zabawne pracować z * jest niedopowiedzeniem! Próba przeanalizowania takich potworów jest koszmarem! :) –

+0

Jeśli chcesz użyć dostępnych narzędzi z pola XML, możesz spróbować użyć XSLT. XSLT jest językiem pełnym Turinga i dlatego jest w stanie wykonać to zadanie, ale nie potrafię powiedzieć, ile wysiłku przyniosłoby to i jeśli wynik byłby kawałkiem kodu. –

3

Jeśli wyrażenie matematyczne polega dopasowane zagnieżdżonych nawiasów, to nie jest to gramatyka regularna ale jeden kontekst wolne i jako takie nie mogą być analizowane za pomocą wyrażenia regularnego.

+0

+1, kiedy wyjąłeś słowa z moich ust. Chociaż można zbliżyć się do cofnięcia, ale to jest ograniczone i jest to, szczerze mówiąc, hack i znak, że używasz niewłaściwego narzędzia do pracy. –

+0

Lepiej sformułowane: * nie można analizować za pomocą implementacji regex nie obsługujących dopasowywania rekursywnego * (Perl, PHP i .NET * mogą * to zrobić). –

+0

@Bart - nie określić język, więc myślę, że jest to standardowy regex, nie Perl – DVK

Powiązane problemy