Комментарии 20
Вот пример рекурсивного регулярного выражения, который недопустим: ($E:{E}){E}
Т.е. рекурсия всё-таки не реализована?
Открыть в Visual Studio C++ 6
Дата релиза - 1998 год. Можно узнать из любопытства, она нормально устанавливается на Win 10?
По началу я подумал, что мне совершенно незачем в них разбираться и в интернете, наверняка, уже есть полно готовых библиотек. Стал искать, нашёл какие-то осколки кода на С++, которые ничего не дают.
Регулярные выражения есть в std начиная с C++11, уже больше 10 лет тому как.
Открыть в Visual Studio C++ 6
А-а, вон оно чо, Михалыч.
{:Digit} соответствует выражению:
(-?[0-9]+.?[0-9]*[Ee]?-?[0-9]*)
При такой регулярке числом будет считаться даже текст "0<E-"
Ну и кроме того Digit - это отдельная цифра. А число это Number.
На машинном уровне это организованно чуточку иначе: https://github.com/monstr518/RegularExpressions/blob/main/RegularExpressions.cpp#L1878
Но минус действительно возможен лишний. Я могу это легко исправить, если хоть кому-то это нужно.
Код - это ужас какой-то. Как будто библиотека напрямую из времён актуальной MSVS 6 прибыла.
using namespace std;
typedef vector<string> V_S;
В заголовочном файле? Так не делали даже тогда.
class BaseFinder {
public:
int type;
Может всё-таки enum, который был ещё в с89?
bool SimvolFinder::isProbelSimvol(const char c){
if(!c)return 1;
const char* chars = " \f\n\r\t\v";
int i;
for(i=0;chars[i];++i)if(c==chars[i])return 1;
return 0;
}
И ещё, очень похоже, что это всё не будет работать с utf8 вообще никак
Грамматики, могущие содержать рекурсию, называются контекстно-свободными. Их теория и способы описания хорошо разработаны. Выражения, подобные регулярным, для них не используют, так как собственно регулярные выражения придуманы для регулярных грамматик, которые по определению не могут содержать рекурсии, и "расширение возможностей" превращает их в жуткий костыль. Для контекстно-свободных грамматик традиционно применяют намного более удобную и легко читаемую форму записи Бэкуса-Наура.
Автор, похоже, независимо изобрёл формализм PEG (parsing expression grammar).
Это способ описания алгоритмов рекурсивного спуска в виде выражений, похожих на регулярные.
Вы мне ещё раз такое скажете, и я свой ScriptX опубликую. Это язык который со старта знает только описание конструкции БеконаСаируса (так чё-то). И он дополняет свой синтаксис, прямо в процессе исполнения кода :).
Рекурсивные регулярные выражения