2010-12-17 5 views
1

Должна быть проверена 1-280 вводных символов, но она зависает, когда вводится более 280 символов.

Уточнение Я использую указанное выше регулярное выражение для проверки длины строки ввода максимум 280 символов. Я использую asp: RegularExpressionValidator для этого.

+0

Более 280 не составляет от 1 до 280 включительно. – Gumbo

+0

Насколько велик вход? Можете ли вы более конкретно о «зависании»? – dheerosaur

+0

@ Gumbo, это не главное - вместо того, чтобы просто терпеть неудачу, он висит, то есть занимает слишком много времени. –

ответ

4

Нет ничего плохого в нем per se, но это ужасно, потому что с большинством двигателей RE (вы не говорите, какой из них вы используете), когда это не соответствует первому, что он пытается, он заставляет двигатель отступать и испытывать множество различных возможностей (ни одна из которых не может привести к совпадению). Так что это не зависание, а скорее просто машина, которая пытается выполнить около 2 операций, чтобы увидеть, возможно ли совпадение. Извините, если я не буду ждать этого!

Разумеется, теоретически возможно, чтобы компилятор RE объединил часть RE-кода (.|\s) во что-то, для чего не требуется обратное отслеживание. Некоторые двигатели RE делают это (как правило, более теоретико-теоретические), но многие из них не работают (на основе стека).

+0

Ключом к слиянию является то, сможет ли движок распознать '.' и '\ s', поскольку оба являются наборами символов и объединяют их в один набор. Если это возможно, RE становится тривиальным, чтобы соответствовать гарантированно-линейному времени. –

+0

Как вы думаете, есть способ переписать регулярное выражение, чтобы потом выбрать? –

+0

@JAngwenyi: В используемом я использую, я бы сделал '^ [\ u0000- \ uffff] {1,280} $', за исключением того, что я бы не сделал этого таким образом вообще (и у двигателя есть ограничения на подсчет тоже; есть и другие случаи, которые намного более неприятны!) Можете ли вы действительно не использовать что-то иное, кроме RE, чтобы выполнить эту проверку? –

0

Он пытается использовать любую возможную комбинацию из . и \s для каждого символа, пытающегося найти версию шаблона, соответствующую строке.

. уже соответствует любому символу, поэтому (.|\s) является избыточным. Кроме того, если вы просто хотите проверить, какая длина строки, то просто сделайте это - почему вы вытаскиваете регулярные выражения?

+2

'.' по умолчанию не будет соответствовать новой строке. – codaddict

+0

@codaddict exaclty! поэтому я скомбинировал оба (. | \ s), но, кажется, зависает при оценке –

+0

K, я использовал asp: RegularExpressionValidator для отображения предупреждающего сообщения на стороне клиента. –

0

Если вы действительно хотите использовать регулярное выражение, вы можете использовать .{1, 280}$ в сочетании с опцией SingleLine, так что . метасимволом будет соответствовать все, в том числе новых линий (см here, Regular Expression API раздел).

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