Opened 4 years ago

Closed 4 years ago

Last modified 15 months ago

#556 closed дефект (готово)

РЭ: ошибки в примерах регулярных выражений (часть 2)

Reported by: alx Owned by: Vladimir
Priority: major Component: Руководство по эксплуатации
Keywords: Cc:

Description

В РЭ аппаратуры MC04-DSL-3U редакции 40 в таблице 7.2 на странице 196 приведены примеры регулярных выражений с пояснениями к ним. В некоторых примерах есть неточности и ошибки.

^[2,3,5]\d{2} Во-первых, здесь символ "запятая" (',') в символьном классе зачем-то указан дважды. Это излишество, любой символ достаточно указать в перечислении один раз. Предлагаю удалить второй символ ',' из примера. Во-вторых, в описании примера говорится: "номер начинается с одной из цифр 2, 3 или 5, затем две любые цифры", но здесь забыт символ "запятая". Предлагаю скорректировать текст описания так: "номер начинается с одной из цифр 2, 3 или 5 или с символа "запятая"...", далее по тексту.

^+?7\d{10} В описании сказано: "в начале номера необязательный символ +, затем цифра 7, затем 10 любых цифр +73422241205 или 73422241205". Так 10 любых цифр, или 3422241205? :) Предполагаю, что здесь пропущено слово "например", и предлагаю его добавить: "...затем 10 любых цифр, например +73422241205...".

^[^6,8] В описании примера сказано: "номер начинается с любой цифры кроме 6 или 8". Это просто неверно. Данное регулярное выражение совпадает со строками, начинающимися с любого символа кроме "шесть", "запятая" или "восемь", а не только с цифры, как здесь написано. Предлагаю исправить описание.

Change History (18)

comment:1 by san, 4 years ago

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

+?7\d{10} В описании сказано: "в начале номера необязательный символ +, затем цифра 7, затем 10 любых цифр +73422241205 или 73422241205". Так 10 любых цифр, или 3422241205? :) Предполагаю, что здесь пропущено слово "например", и предлагаю его добавить: "...затем 10 любых цифр, например +73422241205...".

Да, слово "например" пропущено.

comment:2 by Vladimir, 4 years ago

В РЭ-41 удалил запятые из всех [] и добавил "например":

[235]\d{2} номер начинается с одной из цифр 2, 3 или 5, затем две любые цифры, например, 374

+?7\d{10} в начале номера необязательный символ +, затем цифра 7,
затем 10 любых цифр, например +73422241205 или 73422241205

[68] номер начинается с любой цифры кроме 6 или 8

Теперь правильно?

comment:3 by Vladimir, 4 years ago

Последняя строчка такая:
[68] номер начинается с любой цифры кроме 6 или 8

comment:4 by Vladimir, 4 years ago

Регулярное выражение копируется сюда неправильно:
отсутствуют галочки вверх.
Как копировать регулярные выражения в тикет, чтобы были все знаки?

comment:5 by san, 4 years ago

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

Используйте "Блок кода", 5-я кнопка в панели кнопок, при добавлении комментария.
^[^68]

Last edited 4 years ago by san (previous) (diff)

in reply to:  2 comment:6 by alx, 4 years ago

Replying to Vladimir:

Теперь правильно?

Редакции 41 еще нет на нашем сайте, а в comment:2 символы форматирования перепутались с текстом выражений, поэтому мне трудно судить о правильности.

comment:7 by Vladimir, 4 years ago

^[235]\d{2} номер начинается с одной из цифр 2, 3 или 5, затем две любые цифры, например, 374

^[^68] номер начинается с любой цифры кроме 6 или 8

^+?7\d{10}	в начале номера необязательный символ +, затем цифра 7, 
затем 10 любых цифр, например +73422241205 или 73422241205

Тут нет ошибок?

in reply to:  7 ; comment:8 by alx, 4 years ago

Replying to Vladimir:

Тут нет ошибок?

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

comment:9 by Vladimir, 4 years ago

Тогда по первому РВ будет так:
"... \d{2} ... затем любое количество символов,
указанное в фигурных скобках, например, 374." -

м.б. лучше так:
"... затем количество символов, указанных в фигурных скобках,

например, 374...."

По третьему РВ:
"... \d{10} ... затем количество символов, указанных в фигурных скобках,
например, +73422241205 или 73422241205,

Предложите примеры, содержащие не только цифры, но и знаки...

Last edited 4 years ago by Vladimir (previous) (diff)

comment:10 by san, 4 years ago

Я не смог понять суть последнего комментария)

in reply to:  8 comment:11 by Vladimir, 4 years ago

Replying to alx:

Replying to Vladimir:

Тут нет ошибок?

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

Если Алексей предлагает записать слово "символ" вместо "цифра",
то хорошо бы показать это в примерах, т.е. в примере надо записать не только цифры ("374", "+73422241205 или 73422241205"), но и хоть 1 знак из рег.выражений...

comment:12 by san, 4 years ago

Т.к. таблица относится к настройке рег.выражение набора и проверка на совпадение номера с выражением выполняется после каждой цифры, предлагаю переформулировать вот так:


Примеры:

  • ^2\d{6} - вызов будет немедленно отправлен, как только абонент наберёт цифру 2 и ещё 6 любых цифр, например 2123456;
  • ^[235]\d{2} - вызов будет отправлен, как только будет набрана одна из цифр 2, 3 или 5, и затем две любые цифры, например если абонент наберёт 374;
  • ^+?7\d{10} - вызов будет отправлен, как только будет набран следующий номер: в начале номера необязательный символ +, затем цифра 7, затем 10 любых цифр, например +73422241205 или 73422241205;
  • ^[^68] - вызов будет отправлен после набора одного любого символа кроме 6 или 8;
  • (^7\d{4})|(^6\d{2}) - вызов будет отправлен, как только будет набраны 5 цифр начинающиеся с 7 или 3 цифры начинающиеся с 6, например 71234, 612;
  • /^2(\d{6})/83422\1 - регулярное выражение с заменой - имеет формат /<выражение>/<замена>, где 'выражение' - регулярное выражение, 'замена' - строка, на которую заменяется вызываемый номер в случае его совпадения с регулярным выражением. 'Замена' может содержать подстановки фрагментов регулярного выражения '\1', '\2' и т.д.. В данном примере 'выражение'- ^2(\d{6}), а 'замена' - 83422\1. Если будет набрана цифра 2, а затем ещё 6 любых цифр - произойдёт совпадение с 'выражением', исходный номер будет изменён в соответствии с 'заменой' и вызов будет отправлен на набранный номер с префиксом '8342'. Т.е. если в окончании FxS задать такое выражение в качестве "Рег. выражение номера", то при наборе абонентом на телефоне номера 2241205 вызов будет отправлен на номер 83422241205;

но и хоть 1 знак

Ну вот, например, символ + из выражения ^+?7\d{10}

Last edited 4 years ago by san (previous) (diff)

comment:13 by san, 4 years ago

Владимир Александрович, обратите внимание я изменил текст предыдущего комментария.

in reply to:  12 comment:14 by alx, 4 years ago

Replying to san:

Т.к. таблица относится к настройке рег.выражение набора и проверка на совпадение номера с выражением выполняется после каждой цифры, предлагаю переформулировать вот так:

Строго говоря, это не совсем так. Для канального окончания FXS, к которому подключен простой аналоговый телефон - это так. Цифры номера принимаются последовательно одна за одной, и проверка выполняется после приема каждой цифры. В случае же, например, ISDN PRI, это не так - там в одном сообщении может придти сразу несколько цифр, например сначала 123, затем 456 - в таком случае проверка регулярного выражения будет выполнена лишь два раза (для строк 123 и 123456).

И еще соображение уже по собственно РЭ: а что, для каждого параметра, где используется регулярное выражение, будет такая же таблица с примерами, или только один удостоился такой чести? Если только один, то это непоследовательно. А если для каждого - рационально ли это? Приведенные примеры дают читатель информацию не столько о конфигурационном параметре, сколько о собственно регулярных выражениях (кто уже знаком с регулярными выражениями, для того большинство приведенных примеров и так очевидны). Какова цель этой таблицы с примерами? Не будет ли лучше вынести примеры в какую-то общую вводную часть о регулярных выражениях без привязки к конкретным настройкам?

Last edited 4 years ago by alx (previous) (diff)

comment:15 by san, 4 years ago

Строго говоря, это не совсем так.

Да, согласен, но на мой взгляд, уточнение деталей только запутает пользователя.

для каждого параметра, где используется регулярное выражение, будет такая же таблица с примерами

Для двух наиболее часто используемых настроек Рег.выр набора и вызова(по моей статистике в ходе техподдержки пользователей), есть по большой таблице с примерами, для остальных настроек по небольшому примеру.

Не будет ли лучше вынести примеры в какую-то общую вводную часть

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

comment:16 by Vladimir, 4 years ago

В РЭ-41 внёс изменения:

Табл. 7.2 Регулярные выражения набора/номера

2\d{6} вызов будет немедленно отправлен, как только абонент наберёт цифру 2
и ещё 6 любых цифр, например, 2123456

[235]\d{2} номер начинается с одной из цифр 2, 3 или 5, затем две любые цифры, например, 374

+?7\d{10} в начале номера необязательный символ +, затем цифра 7,
затем 10 любых цифр, например, +73422241205 или 73422241205

[68] номер начинается с любой цифры кроме 6 или 8

(7\d{4})|(6\d{2}) 5 цифр начинающиеся с 7 или 3 цифры, начинающиеся с 6,
например, 71234 или 612

/2(\d{6})/83422\1 регулярное выражение с заменой: номер из 7 цифр, начинающийся с цифры 2, в случае совпадения набранного номера с выражением 2(\d{6}), вызов будет отправлен на номер с префиксом '8342'. Т.е. если в окончании FХS задать такое выражение в качестве
Рег. выражение номера, то при наборе абонентом на телефоне номера 2241205 вызов будет отправлен на номер 83422241205

Если всё правильно, то закрою тикет в Готово.

comment:17 by Vladimir, 4 years ago

Resolution: готово
Status: newclosed

В РЭ-41 по рекомендации SAN изменил 2 строки в Табл.7.1:

(?[34]0\d{2}) например, не будут приниматься вызовы номеров '3074', '4081'

[34]0\d{2}$ принимает только вызовы номеров, начинающихся с одного из символов "три" ('3') или "четыре" ('4'), второй символ которых "ноль" ('0'), за которым следует ровно две любые цифры. Например, '3074', '4081'

comment:18 by san, 15 months ago

milestone: 1 очередь

Milestone deleted

Note: See TracTickets for help on using tickets.