2017-01-03 12 views
0

В приведенном ниже примере у меня есть серия символов в пределах [], которым пользователи могут войти. В этом я хочу, чтобы конкретный персонаж был ограничен, скажем, один раз.Ограничение символа в ряду символов в Regexp

Например, я хочу, чтобы пользователь вводил . только один раз. Теперь я попробовал [\.]{1,1}?, но это не сработало.

"((([-]{1,1}?[0-9\\(]*\\.?[0-9\\(]+[\\+\\-\\*\\/\\)]?)*)|(?:[0-9-+*/^()x\\.?]|<<|>>|!!|&&|[\|]|~|^|abs|e\^x|ln|log|a?(?:sin|cos|tan)h?)+)" 
+0

'X {1,1}?' То же, что и 'X {1,1}' - это то же самое, что и 'X {1}' - это то же самое, что и 'X'. – melpomene

+0

Ваше регулярное выражение сумасшедшее. Он содержит непосредственно вложенные циклы: '([0-9 \ (] +) *' (все остальные части внутренней группы являются необязательными, то есть могут совпадать 0 раз). Он также содержит прямые соседние циклы с совпадающими совпадениями: '[0 -9 \ (] * [0-9 \ (] + '(интервал' \.? 'Между ними не является обязательным). В движке регулярных выражений backtracking это может быть« навсегда »(количество возможных комбинаций, которые могут совпадать, астрономический) – melpomene

+0

Какая реализация регулярного выражения вы используете - действительно ли вы используете библиотеки Qt в соответствии с вашими тегами? Если вы используете язык, пожалуйста, отметьте, например, Python. – halfer

ответ

0

Я предполагаю, что вы скопировали регулярное выражение прямо из своего кода. Следовательно, двукратно экранированные символы не нужны для анализа вашего регулярного выражения. Они только там, потому что вам нужно избегать каждого \ в строке, например. Ява. Начните с анализа следующее регулярное выражение:

((([-]{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) 
  1. Первое вхождение вашей точки является \.?. Это означает, что регулярное выражение совпадает, если есть точка или нет точки. \ ускользает от точки, потому что символ . в противном случае соответствует каждому персонажу. Вопросительный знак ? означает, что предыдущий символ должен иметь место между 0 и 1 раз. То же самое верно для этого регулярного выражения: \.{0,1}. Они равны друг другу.

  2. Здесь уцелевшая точка \. является частью набора [0-9-+*/^()x\.?]. Это означает, что любой из символов внутри набора должен соответствовать точно одному времени, потому что нет квантификатора (например, +, *, ?, {4,12}) после набора. Например, он будет соответствовать 5, +, ^, x, \., но только один раз.

Вопрос теперь, что вы хотите изменить в этом регулярном выражении? Регулярное выражение уже соответствует вашим ожиданиям. Вам необходимо предоставить дополнительную информацию, если ваша проблема отличается от описанной здесь.

+0

Да, регулярное выражение является частью большого регулярного выражения, я обновил свой вопрос с полным регулярным выражением. Я уже пробовал использовать фигурные скобки, но это не сработало. –

+0

@ XavierGeoffrey Я обновил ответ, но до сих пор неясно, чего вы хотите достичь. Вы хотите заставить пользователя использовать точку? –

 Смежные вопросы

  • Нет связанных вопросов^_^