1 (изменено: Serge Yolkin, 2013-02-24 22:39:25)

Тема: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Не уверен, стоило ли создавать новую тему, есть JScript: регулярные выражения, JavaScript: Регулярное выражение и JScript регулярное выражение!, но, поскольку в них обсуждалось по одному вопросу, создал ещё одну такую же...

Собственно, вопрос: можно ли упростить/ сократить/ оптимизировать следующее выражение:

/.{1,650}\.\s*|.{1,650}\?\s*|.{1,650}\!\s*|.{1,650}\;\s*|.{1,650}\,\s*|.{1,650}\s+|.{1,650}$/

?
Чтобы было понятно, следующий код пытается разбить входной текст (без переводов строки) на фрагменты не более 650 символов, причём, сначала - по предложениям (. ? !), потом по ";" и ",", и только потом, если не получилось, по прбелам (ну, или до конца):

var outputArr=inputText.match(/.{1,650}\.\s*|.{1,650}\?\s*|.{1,650}\!\s*|.{1,650}\;\s*|.{1,650}\,\s*|.{1,650}\s+|.{1,650}$/g);

2

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Плохая практика давать темам обобщающие названия.

Serge Yolkin, попробуйте так:

/.{1,650}[.?!]\s*|.{1,650}[;,]\s*|.{1,650}(\s+|$)/g
( 2 * b ) || ! ( 2 * b )

3

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Ну вот... Когда подсказали, всегда кажется: мог бы и сам догадаться...
Rumata, в очередной раз спасибо!

По поводу плохой практики: может, создать отдельную тему "JS/VBS: Помогите написать правильное регулярное выражение" и перенести в неё соответствующие темы (эту и приведённые в первом посте, может, и ещё есть)?

4

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Вот еще (мысль пришла гораздо позже):

/.{1,650}([.?!]\s*|[;,]\s*|\s+|$)/g

Я думаю, что "JS/JScript: Разбиение строки на фрагменты заданной длины" приемлемое название. Хотя могут быть и другие подходящие варианты. Авторов тех тем вряд ли призовешь к переименованию. Возможно модераторы дали бы им другие заголовки.

( 2 * b ) || ! ( 2 * b )

5 (изменено: Serge Yolkin, 2013-02-24 22:42:30)

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Опа! А вот мысль из поста #4 работает некорректно, примерно так же, как [.?!;,]. Т.е. используется последний (перед 650-го символа) разделитель. Без приоритетов.

Что касается переименования, я имел ввиду свалить все такие темы в одну и, в дальнейшем, использовать её для подобных запросов.

6 (изменено: Rumata, 2013-02-24 23:09:11)

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Я против кучи. А потом как люди будут искать в этой куче? А как мы будем ссылаться на готовые решения?

мысль из поста #4 работает некорректно

Это имеете в виду?

Пример



var re1 = /.{1,10}[.?!]\s*|.{1,10}[;,]\s*|.{1,10}(\s+|$)/g;

var re2 = /.{1,10}([.?!]\s*|[;,]\s*|\s+|$)/g;

var s = '123 456 78. 90. 1234 56 78. 90.';

WScript.Echo(re1);
WScript.Echo(s.match(re1).join('\n'));

WScript.Echo(re2);
WScript.Echo(s.match(re2).join('\n'));

Результат:

Первый режет по концам предложений
/.{1,10}[.?!]\s*|.{1,10}[;,]\s*|.{1,10}(\s+|$)/g
123 456 78.
90.
1234 56 78.
90.

Второй режет по любому разделителю, ближайшему к границе (10 символов в примере)
/.{1,10}([.?!]\s*|[;,]\s*|\s+|$)/g
123 456 78.
90. 1234
56 78. 90.

( 2 * b ) || ! ( 2 * b )

7

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Rumata, да. Первый вариант работает идеально, а второй можно записать ещё короче:
/.{1,10}(([.?!;,\s]\s*)|$)/g
я с такого начал, потом получил то, что в первом посте. Так напугался перечислений в квадратных скобках, что вообще от них отказался...

как люди будут искать в этой куче?

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

А как мы будем ссылаться на готовые решения

на отдельный пост можно.

8

Re: JS/JScript: RegExp Разбиение строки на фрагменты заданной длины

Да. Можно записать короче, но я исходил из постановки задачи - "вначале одно, потом другое, ну и напоследок все остальное". Короткий вариант решает другую задачу - "хоть что-нибудь из списка возможных".

( 2 * b ) || ! ( 2 * b )