Opened 5 years ago
Last modified 22 months ago
#554 closed дефект
РЭ: ошибки в примерах регулярных выражений — at Initial Version
Reported by: | alx | Owned by: | Vladimir |
---|---|---|---|
Priority: | major | Component: | Руководство по эксплуатации |
Keywords: | Cc: |
Description
В РЭ аппаратуры MC04-DSL-3U редакции 40 в таблице 7.1 на странице 195 даны некоторые примеры регулярных выражений с комментариями. К сожалению, некоторые из них содержат ошибки.
^537$»
Символ доллара в регулярном выражении совпадает с концом строки, что означает, что после предыдущего символа 7 никаких других символов в номере быть не должно. Однако далее в регулярном выражении стоит символ закрывающих кавычек, который требует, чтобы этот символ был в номере после символа 7. Как результат этого противоречия, такое регулярное выражение никогда не будет совпадать ни с одной строкой. Предполагаю, что символ '»' в регулярное выражение добавлен по ошибке и предлагаю его убрать.
.{4}»
В описании этого примера написано: "4 любых символа, например, 123#". Это не совсем так: данное регулярное выражение требует, чтобы после любых четырех символов непременно следовал символ '»'. Например оно будет совпадать со строками Станция «Мир»
, 1234»лабуда
, но не будет совпадать со строками Навальный
или Путин
, хотя в последних имеется четыре символа. Предлагаю либо добавить в описание примера уточнение ", за которыми следует символ '»'", либо убрать символ '»' из регулярного выражения.
^2\d{6}
В описании этого примера сказано: "номер длиной не менее 7 цифр и начинается с цифры 2". Описание не совсем точное, так как не очень внимательный читатель может понять его как "любое число цифр, но не менее 7, начинающийся с 2", хотя на самом деле после 7 цифр могут следовать любые символы, что верно показано в примере далее. Предлагаю переформулировать описание примерно так: "номер, начинающийся с цифры 2, за которой следуют 6 любых цифр, за которыми могут следовать любые другие символы".
^(?![3,4]0\d{2})\d*
С этим примером сразу несколько проблем. Во-первых, оно оканчивается на \d*
, что означает любое количество цифр (включая нулевое). Но, так как в регулярном выражении нет символа '$' (конец строки), после этих цифр строка может содержать любые другие символы, в том числе и опять цифры! Таким образом, фрагмент \d*
в данном выражении не имеет никакого эффекта, и может быть удален. Поэтому предлагаю не учить читателя плохому, а сразу удалить этот фрагмент из примера, сделав пример более простым для чтения и понимания: ^(?![3,4]0\d{2})
. Во-вторых, в описании к примеру написано: "принимает все вызовы кроме номеров начинающихся на 30хх, 40хх". Это неверно. Как раз 30xx
и 40xx
будут приниматься (совпадают с регулярным выражением), потому что данное регулярное выражение имеет следующий смысл: совпадает со всем кроме начинающегося с одного из символов "три" ('3'), "запятая" (',') или "четыре" ('4'), за которым следует символ '0', за которым следуют две любые цифры. Символ же 'x' цифрой не является. Да, я догадался, что под символом 'x' подразумевалась цифра, но у читателя, незнакомого с регулярными выражениями (а иначе ему не нужен этот раздел), оснований для такой догадки нет, и он будет воспринимать все написанное буквально! Предлагаю приведенную мной формулировку и записать в качестве пояснения. И привести такие примеры: "Например не будут приниматься вызовы номеров '3074', ',039', '4081'".
^[3,4]0\d{2}$
В описании написано: "принимает вызовы только на номера вида 30хх, 40хx". Здесь в описании та же проблема, что и в предыдущем примере. Предлагаю переформулировать описание примерно так: принимает только вызовы номеров, начинающихся с одного из символов "три" ('3'), "запятая" (',') или "четыре" ('4'), второй символ которых "ноль" ('0'), за которым следует ровно две любые цифры. Например '3074', ',039', '4081'.
/^2(\d{6})/83422\1
Во-первых, стоит, наверное, во вводной части уточнить, что ряд конфигурационных параметров поддерживает специальную форму записи - регулярное выражение с заменой, иначе неискушенный читатель подумает, что такая форма - часть синтаксиса PCRE. На самом деле это не так, такая форма записи - наше собственное изобретение. Во-вторых, в описании к примеру написано: "номер из 7 цифр, начинающийся с цифры 2". Это не совсем точно. Более точным будет "из 7 цифр, за которыми могут следовать любые символы". Далее же текст "к номеру добавляется префикс '8342'" следует дополнить: "и из номера удаляются все символы кроме первых семи" (так как только цифры номера со 2-й по 7-ю добавляются к комбинации '83422' в правой части).