Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
1

Регулярные выражения в Delphi: как проверить, является ли строка допустимым именем узла xml?

28.12.2019, 12:56. Показов 1535. Ответов 14
Метки нет (Все метки)

Доброго времени суток!

Нужно определить корректность имени узла XML, вводимого пользователем. Здесь нашел регулярное выражение для проверки. Сравнил его с рекомендацией WW3 для допустимого состава символов NameChar. Вроде все законно. Но при использовании данного выражения в Delphi средствами модуля RegularExpressions.pas возникает ошибка разбора выражения "Error in regular expression at offset 57: range out of order in character class". Подскажите, в чем проблема?

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const
  nodeNameRegex = '~^[:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-'    +
                  '\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-' +
                  '\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}]'        +
                  '[:A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x{2FF}\\x{370}-\\x{37D}\\x{37F}-'      +
                  '\\x{1FFF}\\x{200C}-\\x{200D}\\x{2070}-\\x{218F}\\x{2C00}-\\x{2FEF}\\x{3001}-' +
                  '\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFFD}\\x{10000}-\\x{EFFFF}.\\-0-9'  +
                  '\\xB7\\x{0300}-\\x{036F}\\x{203F}-\\x{2040}]*$~u';
 
function validateNodeName(const nodeName: string): boolean;
var
  RegEx: TRegEx;
begin
  Result := RegEx.IsMatch(nodeName, nodeNameRegex);
end;
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.12.2019, 12:56
Ответы с готовыми решениями:

Если строка является допустимым именем файла, то создать пустой файл с этим именем
Помогите решить Дана строка S. Если S является допустимым именем файла, то создать пустой файл с...

Регулярные выражения. Проверить является ли строка идентификатором
using System; using System.Text.RegularExpressions; namespace ConsoleApp2 { class Program...

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

Проверить, является ли строка допустимым идентификатором языка «С»
Описать функцию IsIdent целого типа, проверяющую, является ли строка S (переданная в качестве...

14
Продавец времени
6457 / 3454 / 801
Регистрация: 12.03.2015
Сообщений: 16,492
28.12.2019, 13:20 2
Цитата Сообщение от Phil357 Посмотреть сообщение
Нужно определить корректность имени узла XML, вводимого пользователем.
Вот это интрига! А зачем заставлять бедного несчастного юзера вводить имя узла XML???!!!
0
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
28.12.2019, 13:26  [ТС] 3
Вот это интрига! А зачем заставлять бедного несчастного юзера вводить имя узла XML???!!!
Прошу отвечать по делу. Вы можете чем то помочь?
0
Продавец времени
6457 / 3454 / 801
Регистрация: 12.03.2015
Сообщений: 16,492
28.12.2019, 13:46 4
Цитата Сообщение от Phil357 Посмотреть сообщение
Прошу отвечать по делу. Вы можете чем то помочь?
Да, могу. Мне приходилось много и плодотворно работать с XML.
0
4265 / 2806 / 410
Регистрация: 01.06.2013
Сообщений: 5,892
Записей в блоге: 9
28.12.2019, 13:53 5
Лучше дать проверить имя парсеру XML, тем более что оно может зависеть от кодировки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function XMLNameCheck(name:string):boolean;
var
  XML:TXMLDocument;
  n,s:AnsiString;
begin
  result:=true;
  n:=AnsiString(name);
  s:='<?xml version="1.0" encoding="windows-1251"?><' + n +
       '></'+n+'>';
  XML := TXMLDocument.Create(nil);
  try
    try
       XML.LoadFromXML(s);
    except on E: EDOMParseError do
       result:=false;
    end;
  finally
    XML.Free;
  end;
end;
0
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
28.12.2019, 14:00  [ТС] 6
Лучше дать проверить имя парсеру XML, тем более что оно может зависеть от кодировки
Прошу помочь с решением на основе регулярного выражения. Костыли не устраивают
0
Продавец времени
6457 / 3454 / 801
Регистрация: 12.03.2015
Сообщений: 16,492
28.12.2019, 14:09 7
Цитата Сообщение от Phil357 Посмотреть сообщение
Прошу помочь с решением на основе регулярного выражения. Костыли не устраивают
Тебе надо шашечки или ехать? Чо ты привязался к регулярным выражениям-то? Проверить валидность пути XML можно без них.
1
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
28.12.2019, 15:54  [ТС] 8
Тебе надо шашечки или ехать? Чо ты привязался к регулярным выражениям-то? Проверить валидность пути XML можно без них.
Есть конкретный вопрос. Я прошу конкретного ответа на конкретно поставленный вопрос. Если такового не находится, прошу не отвечать вовсе, не флудить. Благодарю за понимание. Не засоряйте тему пожалуйста!!!!!!!!!!

Добавлено через 1 час 42 минуты
Мда... Сам спросил, сам ответил...
1. В задаваемом регулярном выражении нужно удалить все фигурные скобки.
2. Убрать знак тильды в начале и конце выражения + убрать в конце символ u (в delphi "не жадные" выражения обозначаются символом "?" насколько я понял).
3. Есть ошибка в части ".\\-0-9" - лишний бэкслеш.
Получилось вот так:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
const
  nameFirstChar = ':A-Z_a-z\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\x2FF\\x370-\\x37D'     +
                  '\\x37F-\\x1FFF\\x200C-\\x200D\\x2070-\\x218F\\x2C00-\\x2FEF' +
                  '\\x3001-\\xD7FF\\xF900-\\xFDCF\\xFDF0-\\xFFFD\\x10000-\\xEFFFF';
  nameNextChar  = nameFirstChar + '.\-0-9\\xB7\\x0300-\\x036F\\x203F-\\x2040';
  nodeNameRegex = '^[' + nameFirstChar + '][' + nameNextChar + ']*$';
 
function validateNodeName(const nodeName: string): boolean;
var
  RegEx: TRegEx;
begin
  Result := RegEx.IsMatch(nodeName, nodeNameRegex);
end;
Правда осталось непонятным, почему все перечисленные Юникоды не дают возможности применения кириллицы в качестве допустимых символов (что с ними, что без них работает одинаково)...
0
2768 / 1575 / 525
Регистрация: 29.05.2013
Сообщений: 6,831
28.12.2019, 19:31 9
Если под корректностью подразумевается, ограничение на введенные символы, то без регулярок проще будет. Если же идет проверка на имя существующего узла, то опять без регулярок проще будет. Судя по всему вам очень хотелось использовать IsMath для этого и тогда конечно ваш путь верный, но... недальновидный
0
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
28.12.2019, 22:22  [ТС] 10
Если под корректностью подразумевается, ограничение на введенные символы, то без регулярок проще будет. Если же идет проверка на имя существующего узла, то опять без регулярок проще будет. Судя по всему вам очень хотелось использовать IsMath для этого и тогда конечно ваш путь верный, но... недальновидный
Все таки русский человек - это уникальный человек. На вопрос «как это сделать» он дает ответ «зачем так не надо делать», тогда как требовалось лишь помочь преодалеть ошибки УЖЕ ВЫБРАННОГО пути. Иначе говоря вопрос про одно, а ответ может быть на совершенно неожиданную тему!!!!!

Теперь по сути: ваши догадки все мимо. На самом деле пишется код объекта данных, который будет предоставлять базовые услуги хранения, загрузки, сохранения и обмена данными внутри программы с использованием технологии xml. На этапе проектирования структуры данных, объектам потомкам этого базового объекта будут сообщаться имена узлов xml, с которыми они будут взаимодействовать. Здесь и понадобится проверка корректности вводимого имени, поскольку библиотеку базовых обьектов могу использовать в своих программах могу не только я.

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

Добавлено через 28 минут
P.S. Я хочу использовать регулярки НЕ ради использования регулярок, НО для элегантного бескостыльного решения вполне подходящей для них задачи
0
Продавец времени
6457 / 3454 / 801
Регистрация: 12.03.2015
Сообщений: 16,492
28.12.2019, 22:25 11
Цитата Сообщение от Phil357 Посмотреть сообщение
Все таки русский человек - это уникальный человек. На вопрос «как это сделать» он дает ответ «зачем так не надо делать», тогда как требовалось лишь помочь преодалеть ошибки УЖЕ ВЫБРАННОГО пути. Иначе говоря вопрос про одно, а ответ может быть на совершенно неожиданную тему!!!!!
Причина такого поведения отвечающих - здесь.
Да, конечно, саморезы можно забивать молотком, но шуруповёртом это будет удобнее, быстрее и качественнее.

Сорри за оффтоп. Я не долго программистом работаю - чуть дольше 20 лет. Это, всего лишь, моё мнение, не более.
1
4265 / 2806 / 410
Регистрация: 01.06.2013
Сообщений: 5,892
Записей в блоге: 9
28.12.2019, 22:30 12
Цитата Сообщение от Phil357 Посмотреть сообщение
это все не нужно было ссобщать в вопросе
Нужно было. Нужно сообщать для чего это вам понадобилось. Очень часто на форуме спрашивают одно, а выясняется что спрашивающему не от той печки плясать нужно было.
Цитата Сообщение от Phil357 Посмотреть сообщение
пишется код объекта данных, который будет предоставлять базовые услуги хранения, загрузки, сохранения и обмена данными внутри программы с использованием технологии xml. На этапе проектирования структуры данных, объектам потомкам этого базового объекта будут сообщаться имена узлов xml, с которыми они будут взаимодействовать. Здесь и понадобится проверка корректности вводимого имени, поскольку библиотеку базовых обьектов могу использовать в своих программах могу не только я.
Вот и ошибка. Вы отделяете парсинг от проверки. При этом вы не сможете гарантировать что ваш или не ваш парсер корректно обработает то, что проходило отдельную проверку и наоборот, что то не будет проходить проверку а парсер бы обработал. Разумеется, свой парсер xml делать нет смысла, ну этого я не касаюсь, и даже не ясно, свой ли вы сочинили или готовый использовали. Как раз ваше решение сделать независимую от парсера проверку, это костыль.

Не по теме:

Цитата Сообщение от Phil357 Посмотреть сообщение
Все таки русский человек - это уникальный человек. На вопрос «как это сделать» он дает ответ «зачем так не надо делать»
Русский человек - это разумный человек, мыслящий творчески. :)

1
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
29.12.2019, 04:33  [ТС] 13
Да, конечно, саморезы можно забивать молотком, но шуруповёртом это будет удобнее, быстрее и качественнее
На поставленный вопрос мне здесь ответят? Или за 20 с лишним лет программирования никто не работал с регулярными выражениями в среде delphi? Предпочитая на автомобиле за шурупами в магазин в соседнем подьезде гонять на своем инфинити, или на чем там гоняют в соседний подьезд маститые программисты?

Добавлено через 3 минуты
Вот и ошибка. Вы отделяете парсинг от проверки. При этом вы не сможете гарантировать что ваш или не ваш парсер корректно обработает то, что проходило отдельную проверку и наоборот, что то не будет проходить проверку а парсер бы обработал. Разумеется, свой парсер xml делать нет смысла, ну этого я не касаюсь, и даже не ясно, свой ли вы сочинили или готовый использовали. Как раз ваше решение сделать независимую от парсера проверку, это костыль.
Хреновый парсер, если не считается с требованиями стандартов WW3
0
881 / 584 / 178
Регистрация: 28.02.2017
Сообщений: 2,359
Записей в блоге: 1
30.12.2019, 01:07 14
Сперва я тоже подумал, что это та категория вопросов, где нельзя регулярными... Но потом вчитался...
Если я верно понял - как раз тут как раз регулярку и надо. Всё верно.

Нет такого понятия как "регулярки среды delphi", есть ряд разных библиотек для такого фукнционала.
У каждой будут свои возможности и ограничения. И баги тоже могут быть свои.

Итак, вы используете модуль идущий с самой Делфи? Какая версия Делфи у вас?

Добавлено через 2 минуты
И кстати в #5 была вполне рабочая мысль... Слегка избыточная, но возможно даже более подходящая - если построенный XML позже будет читаться этим же парсером.
0
19 / 3 / 1
Регистрация: 26.12.2014
Сообщений: 50
30.12.2019, 10:02  [ТС] 15
Версия delphi rio 10.3. Библиотека встроенная, regularExpressions.pas. Что касается решения в #5, решение прямолинейное, «в лоб» что называется. Не нравится такое решение именно своей избыточностью.
Пегулярками особо не пользовался, в самом простейшем виде. Сейчас понадобилось быстро решить эту частную проблему, уперся в знаки юникода, программа их в данном выражении не воспринимает, пост #8. С прочим нормально отрабатывает. Подскажите, что не так в написании выражения?

Добавлено через 2 часа 24 минуты
Вот этот код заработал так как нужно:

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
const
  nameStartChar = ':A-Z_a-z\x{C0}-\x{D6}\x{D8}-\x{F6}\x{F8}-\x{2FF}\x{370}-\x{37D}'     +
                  '\x{37F}-\x{1FFF}\x{200C}-\x{200D}\x{2070}-\x{218F}\x{2C00}-\x{2FEF}' +
                  '\x{3001}-\x{D7FF}\x{F900}-\x{FDCF}\x{FDF0}-\x{FFFD}\x{10000}-\x{EFFFF}';
  nameNextChar  = nameStartChar + '.\-0-9\x{B7}\x{0300}-\x{036F}\x{203F}-\x{2040}';
  nodeNameRegex = '^[' + nameStartChar + '][' + nameNextChar + ']*$';
 
function validateNodeName(const nodeName: unicodestring): boolean;
var
  RegEx: TRegEx;
begin
  Result := RegEx.IsMatch(nodeName, nodeNameRegex);
end;
Благодарю всех тех кто откликнулся и помог найти решение на заданный вопрос!

Добавлено через 9 минут
Отдельная благодарность всем знатокам регулярных выражений и xml с многолетним опытом работы программистом

Добавлено через 15 минут
Наши люди, в булочную, на такси не ездят! (цитата из к/ф "Бриллиантовая рука")
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.12.2019, 10:02

Проверить, является ли введенная строка допустимым идентификатором языка Pascal
Написать программу, проверяющую, является ли введенная строка допустимым идентификатором языка...

Если S является допустимым именем файла, то создать пустой файл с именем и вывести True
помогите решить. срочно надо сегодня сдавать. Дана строка S. Если S является допустимым именем...

Если S является допустимым именем файла, то создать пустой файл с именем и вывести True
Дана строка S. Если S является допустимым именем файла, то создать пустой файл с этим именем и...

Регулярные выражения. Проверить, является ли домен белорусским
Вводим домен, типа: www.vk.com. Проверить, является ли домен белорусским


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru