Я предполагаю, что вы скопировали регулярное выражение прямо из своего кода. Следовательно, двукратно экранированные символы не нужны для анализа вашего регулярного выражения. Они только там, потому что вам нужно избегать каждого \
в строке, например. Ява. Начните с анализа следующее регулярное выражение:
((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)
В вашем вопросе вы упомянули, что вы хотите ограничить знак точки (.
) ограничиваться только один символ. Первый вопрос сейчас, который .
вы на самом деле имеете в виду? В вашем регулярном выражении есть 2 точки.
((([-]{1,1}?[0-9\(]*\.?[0-9\(]+[\+\-\*\/\)]?)*)|(?:[0-9-+*/^()x\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)
↑↑↑ (1) ↑↑ (2)
Первое вхождение вашей точки является \.?
. Это означает, что регулярное выражение совпадает, если есть точка или нет точки. \
ускользает от точки, потому что символ .
в противном случае соответствует каждому персонажу. Вопросительный знак ?
означает, что предыдущий символ должен иметь место между 0 и 1 раз. То же самое верно для этого регулярного выражения: \.{0,1}
. Они равны друг другу.
Здесь уцелевшая точка \.
является частью набора [0-9-+*/^()x\.?]
. Это означает, что любой из символов внутри набора должен соответствовать точно одному времени, потому что нет квантификатора (например, +
, *
, ?
, {4,12}
) после набора. Например, он будет соответствовать 5
, +
, ^
, x
, \.
, но только один раз.
Вопрос теперь, что вы хотите изменить в этом регулярном выражении? Регулярное выражение уже соответствует вашим ожиданиям. Вам необходимо предоставить дополнительную информацию, если ваша проблема отличается от описанной здесь.
'X {1,1}?' То же, что и 'X {1,1}' - это то же самое, что и 'X {1}' - это то же самое, что и 'X'. – melpomene
Ваше регулярное выражение сумасшедшее. Он содержит непосредственно вложенные циклы: '([0-9 \ (] +) *' (все остальные части внутренней группы являются необязательными, то есть могут совпадать 0 раз). Он также содержит прямые соседние циклы с совпадающими совпадениями: '[0 -9 \ (] * [0-9 \ (] + '(интервал' \.? 'Между ними не является обязательным). В движке регулярных выражений backtracking это может быть« навсегда »(количество возможных комбинаций, которые могут совпадать, астрономический) – melpomene
Какая реализация регулярного выражения вы используете - действительно ли вы используете библиотеки Qt в соответствии с вашими тегами? Если вы используете язык, пожалуйста, отметьте, например, Python. – halfer