2015-05-19 3 views
2

Я хотел бы иметь регулярное выражение с этим допускается следующее:Regex с максимальной длиной линии и максимальным общим символов

текста для которой каждая строка имеет максимальную длину, позволяет сказать, 10, а общий текст имеет максимальное количество общих символов (скажем, 30).

Например, это было бы некоторые действительные входы:

1)

1234567890 

2)

123456789 

1234567890 

3)

12 
123456 

12456 

И это было бы несколько недействительные входы:

1)

12345678901 

2)

1234567890 

1234567890 
1234567890 

(обратите внимание, что недопустимый пример 2 превышает 30 символов ограничения в связи с новой строкой)

До сих пор это регулярное выражение: ^([^\r\n]{0,10}(\r?\n|$)){5}$ (протестировать его here)
Он почти соответствует моим требованиям, за исключением того, что максимальный ввод составляет 5 строк вместо 30 символов. Я уже приложил много усилий в этом регулярном выражении, но теперь я застрял.

В каких модификациях мое Regex должно соответствовать 30 символам?

+0

Мне нравится regex, но это может быть сделано на языке программирования в кратчайшие сроки без каких-либо проблем. – yamm

+0

@yamm Мне бы это понравилось, но я ограничен регулярным выражением atm – moffeltje

+0

'len (текст) <= 30 и len (text.splitlines()) <= 5 и все (len (n) <= 10 для n в text.splitlines()) 'это будет выражение python, которое будет True, если ваши критерии mach и False в противном случае. – yamm

ответ

4

Добавить look ahead в своем регулярном выражении:

^(?=[\s\S]{1,30}$)([^\r\n]{0,10}(\r?\n|$)){5}$ 

Perl-скрипт:

my $re = qr~^(?=[\s\S]{1,30}$)([^\r\n]{0,10}(\r?\n|$)){5}$~; 
my @data = (
'12 
123456 

12456', 
'12345678901'); 
for my $str(@data) { 
    say $str, ' : ',($str =~ $re ? 'OK' : 'KO'); 
} 

Выход:

12 
123456 

12456 : OK 
12345678901 : KO 
+1

Это не соответствует * никаким * действительным примерам OP. – Siguza

+0

ОК, я только что забыл квантификатор. – Toto

+0

Работает нормально для меня! – moffeltje

2

Вам нужно что-то вроде и oprator. «правило1 и правило2». Согласно другому question это выполняется с использованием не потребляющих выражений.

(?=^([^\r\n]{0,10}(\r?\n|$)))[\s\S]{1,30} 

Я не уверен, синтаксис верен. Но используйте его как отправную точку.

+0

Вы забыли закрытие ')', но, к сожалению, это не соответствует моим действительным входам. – moffeltje

+0

Вам нужно будет заменить '.'' '\ \ \ \ \ \ \ \ \ \ \ \\ \\ \ \" \\ \\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ – Siguza

+0

@ Сигуза Вы правы. Я должен использовать [\ s \ S] вместо '.'. moffeltje: Даже если вы указали мне на пропавших без вести), я не нашел его на некоторое время. Я отредактировал ответ. Я также удалил второй (? = .., потому что мы хотим сейчас использовать текст. –