Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 5.00/25: Рейтинг темы: голосов - 25, средняя оценка - 5.00
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
1

Разбор строки по шаблону

17.10.2017, 19:51. Показов 4894. Ответов 36
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Может у кого то есть, поэтому сначала задам вопрос:
Требуется написать функцию которая проверяет есть ли вхождение шаблона (вид шаблона: %a[1]%a[2]%a[3]%a[4]%a[5]% % - подстрока любой длины и состоящая из любых символов)) в строку S. Если результат True, то вернуть массив состоящий из подстрок.
Пример:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Var
  A:array of string;
  S,Pattern:String;
 
Implementation
 
внутри функции ...
.....
S='Строка состоящая из нескольких_слов_и цифр';
Pattern='% % %_слов%';
result=Razbor(S,Pattern,A);
if result then
   for i:=Low(A) to High(A) do ShowMessage(A[i]);
....
конец функции.
 
Function Razbor(S,Pattern:String;A:array of string):boolean; 
end;
Общем исходя из выше описанного следует следующее: Если шаблон нашелся. (а в начальных данных приведен случай когда он есть). то последовательно выводятся строки.
a[1]='Строка состоящая'
a[2]='из'
a[3]='нескольких'
a[4]='_и цифр'

Может у кого то подобное уже реализовано, и не жалко поделится. При этом в идеале еще и чтобы на регист букв внимание не обращала. Ну к примеру еще 1 параметр передавать F(регист не важен) или T(регист важен).
Function Razbor(S,Pattern:String;Flag:boolean;A:array of string):boolean;
Вот что то типа такого.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2017, 19:51
Ответы с готовыми решениями:

Cинтаксический анализ (разбор) арифметического выражения (a-b)^2 по заданному шаблону
Написать программу, реализующую простейший синтаксический анализ (разбор) арифметического...

Книга "Конечный автомат 2: Возвращение". Часть 1. Разбор. Глава 8. Имя, проверка строки и разбор до. На том ли я пути?
Наверное, иногда прилюдно выругаться полезно... Стоило мне в предыдущей теме написать...

Проверка строки по шаблону
Добрых времени суток. Есть строка такого типа: BlaBla.Bla(Bla.Bla()); которую нужно проверить...

Замена текста по шаблону и удаление внешних тегов, относящихся к найденному шаблону
Привет всем, Есть небольшой html файл в котором надо искать вот такие шаблоны: @130, @131, @132...

36
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
17.10.2017, 20:01 2
Цитата Сообщение от Setix Посмотреть сообщение
Может у кого то подобное уже реализовано, и не жалко поделится.
очень похоже на StringList
0
Native x86
Эксперт Hardware
5514 / 3273 / 934
Регистрация: 13.02.2013
Сообщений: 10,423
17.10.2017, 20:14 3
Лучший ответ Сообщение было отмечено Setix как решение

Решение

Почему бы не использовать регулярные выражения?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses
  System.RegularExpressionsCore;
var
  RegEx: TPerlRegEx;
  i: Integer;
begin
  RegEx := TPerlRegEx.Create;
  try
    RegEx.Options := [preCaseLess, preSingleLine];
    RegEx.RegEx := '^(.*) (.*) (.*)_слов(.*)$';
    RegEx.Compile;
    RegEx.Subject := 'Строка состоящая из нескольких_слов_и цифр';
    if RegEx.Match then
      for i := 1 to RegEx.GroupsCount do
         ShowMessage(RegEx.Groups[i]);
  finally
    RegEx.Free;
  end;
Писал по памяти, возможны помарки. Так же вероятно вместо звездочек вам больше подойдут плюсы, а вместо одиночных пробелов -- шаблон типа \s+.
1
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
17.10.2017, 22:39 4
Цитата Сообщение от quwy Посмотреть сообщение
Почему бы не использовать регулярные выражения?
а ТС не написал какие у него разделители
судя по тестовой строке - это не пробел
0
843 / 738 / 342
Регистрация: 22.09.2012
Сообщений: 5,034
18.10.2017, 17:54 5
Setix,
Регулярка в помощь! Вписывай в переменную регулярки свой шаблон и дело сделано! Пример выше дан.
0
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
19.10.2017, 12:35  [ТС] 6
Цитата Сообщение от quwy Посмотреть сообщение
Почему бы не использовать регулярные выражения?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
uses
* System.RegularExpressionsCore;
var
* RegEx: TPerlRegEx;
* i: Integer;
begin
* RegEx := TPerlRegEx.Create;
* try
* * RegEx.Options := [preCaseLess, preSingleLine];
* * RegEx.RegEx := '^(.*) (.*) (.*)_слов(.*)$';
* * RegEx.Compile;
* * RegEx.Subject := 'Строка состоящая из нескольких_слов_и цифр';
* * if RegEx.Match then
* * * for i := 1 to RegEx.GroupsCount do
* * * * *ShowMessage(RegEx.Groups[i]);
* finally
* * RegEx.Free;
* end;
Писал по памяти, возможны помарки. Так же вероятно вместо звездочек вам больше подойдут плюсы, а вместо одиночных пробелов -- шаблон типа \s+.
Об этом классе не слышал до этого. Хотелось бы не привлекать сторонний класс.

Цитата Сообщение от qwertehok Посмотреть сообщение
а ТС не написал какие у него разделители
судя по тестовой строке - это не пробел
В качестве разделителя используется - символ %
Цитата Сообщение от qwertehok Посмотреть сообщение
очень похоже на StringList
суть в том что есть строка S, надо выделить подстроки между разделителями и поместить их в строковый массив. - парсер просто пишу. Функция будет просто находить 1 вхождение шаблона и помещать подстроки в массив, который в свою очередь потом в последствии и использоваться.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
19.10.2017, 13:06 7
Цитата Сообщение от Setix Посмотреть сообщение
есть строка S, надо выделить подстроки между разделителями и поместить их в строковый массив
SplitString() в помощь.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.10.2017, 13:07 8
Цитата Сообщение от Setix Посмотреть сообщение
суть в том что есть строка S, надо выделить подстроки между разделителями и поместить их в строковый массив.
используй StringList, даже массив не нужен
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
19.10.2017, 13:08 9
Цитата Сообщение от qwertehok Посмотреть сообщение
используй StringList
необязательно
0
qwertehok
19.10.2017, 13:10
  #10

Не по теме:

а где написано что обязательно?

0
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
19.10.2017, 13:10  [ТС] 11
Цитата Сообщение от qwertehok Посмотреть сообщение
используй StringList, даже массив не нужен
Мне принципиально использование массива.
0
Эксперт Pascal/Delphi
4912 / 2781 / 853
Регистрация: 04.10.2012
Сообщений: 10,121
19.10.2017, 13:15 12

Не по теме:

Цитата Сообщение от qwertehok Посмотреть сообщение
а где написано что обязательно?
здесь :)
Цитата Сообщение от Setix Посмотреть сообщение
принципиально использование массива



Setix, пример к моему п. #7:
Delphi
1
2
3
4
5
6
7
8
9
10
11
uses StrUtils, Types,...;
//...
var
s:string;
strArr:TStringDynArray;
//...
//есть строка
s :='один%два%три';
strArr :=SplitString(s, '%');// разбиваем ее
// получаем массив strArr[0], strArr[1] и т.д.
//...
0
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
19.10.2017, 14:08  [ТС] 13
В общем сам запутался с вами написал бред )))).
Задание: Написать функцию, которая будет разбивать строку - на массив строк в зависимости от шаблона. В качестве разделителя может использоваться любой символ(набор символов) который находится между знаками %. В свою очередь кол-во элементов массива будет равно кол-ву знаков %.

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Пример.
Var
S:String;
Pattern:String;
A:array of string;
 
Implementation
...
S='Строка состоящая из нескольких_слов_и цифр';
Pattern='% % %_слов%';
result=Razbor(S,Pattern,A);
if result then
   for i:=Low(A) to High(A) do ShowMessage(A[i]);
...
 
Function Razbor(S,Pattern:String;A:array of string):boolean; 
...
end;
исходя из шаблона должен получится массив из 4 элементов.

В принципе уже привели пример использования класса TPerlRegEx. посмотрел как работает в принципе устраивает, но он последний шаблон выводит. Т.е

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
uses
  System.RegularExpressionsCore;
var
  RegEx: TPerlRegEx;
  i: Integer;
begin
  RegEx := TPerlRegEx.Create;
  try
    RegEx.Options := [preCaseLess, preSingleLine];
    RegEx.RegEx := '^(.*)нескольких(.*)$';
    RegEx.Compile;
    RegEx.Subject := 'Строка состоящая из нескольких_нескольких_слов';
    if RegEx.Match then
      for i := 1 to RegEx.GroupCount do
        ShowMessage(RegEx.Groups[i]);
  finally
    RegEx.Free;
  end;
end;
исходя из шаблона должен получится массив из 2 элементов.

Пример не много подправил чтобы показать что мне надо и что выводит.
На выходе получаем:
RegEx.Groups[1]=Строка состоящая из нескольких_
RegEx.Groups[2]=_слов
А надо
RegEx.Groups[1]=Строка состоящая из
RegEx.Groups[2]=_нескольких_слов
Т.е. он ищет с конца вхождение строки, мне бы надо сначала.

Но все таки хотелось бы без использования класса что то увидеть.

Цитата Сообщение от droider Посмотреть сообщение
SplitString() в помощь
Метод посмотрел к сожалению не подходит. В этом методе в виде шаблона может использоваться 1 символ, если использовать в виде шаблона(массив символов), то каждый из них становится разделителем.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.10.2017, 14:12 14
Цитата Сообщение от Setix Посмотреть сообщение
В общем сам запутался с вами написал бред )))).
мы не сомневались

Цитата Сообщение от Setix Посмотреть сообщение
Задание: Написать функцию, которая будет разбивать строку - на массив строк в зависимости от шаблона.
на входе строка и разделитель
на выходе у функции что?

ЗЫ опять напомню про StringList.
0
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
19.10.2017, 14:25  [ТС] 15
На входе:
1. строка с данными.
2. шаблон.
3. имя массива куда складывать результат.
На выходе:
1. массив (кол-во элементов массива равно кол-ву символов: % в шаблоне).
2. True - шаблон есть в строке. False - шаблон не найден.

В качестве разделителя используется подстрока которая находится между значками %.
Пример:
S='gshdgfh dsfgh_djfhjhjсловоjdjkdjfk jhjj'
Pattern='%_%слово%'
Исходя из шаблона должен получится массив из 3 элементов так как 3 символа %.
A[1]='gshdgfh dsfgh';
A[2]='djfhjhj';
A[3]='jdjkdjfk jhjj';

Добавлено через 6 минут
Цитата Сообщение от qwertehok Посмотреть сообщение
ЗЫ опять напомню про StringList.
нет разницы во что ты будешь ложить результат. В StringList или в массив строк. Суть не в элементе где будет хранится информация, а в том чтобы извлечь из строки ее...
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.10.2017, 14:34 16
Цитата Сообщение от Setix Посмотреть сообщение
3. имя массива куда складывать результат.
О_о

Цитата Сообщение от Setix Посмотреть сообщение
2. True - шаблон есть в строке. False - шаблон не найден.
о_О

Цитата Сообщение от Setix Посмотреть сообщение
В качестве разделителя используется подстрока которая находится между значками %.
Пример:
S='gshdgfh dsfgh_djfhjhjсловоjdjkdjfk jhjj'
Pattern='%_%слово%'
Исходя из шаблона должен получится массив из 3 элементов так как 3 символа %.
A[1]='gshdgfh dsfgh';
A[2]='djfhjhj';
A[3]='jdjkdjfk jhjj';
что такое шаблон? при чем тут 3 знака %?
0
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
19.10.2017, 14:50  [ТС] 17
Цитата Сообщение от qwertehok Посмотреть сообщение
что такое шаблон?
шаблон представляет собой строку вида:
%Разделитель_1%Разделитель_2%_Разделитель_3%.... .
Цитата Сообщение от qwertehok Посмотреть сообщение
при чем тут 3 знака %?
в шаблоне используется знак %, он собой заменяет информацию из основной строки, которую я хочу получить.
т.е. в 1 элемент массива ложу то что находится до Разделитель_1.
во 2 элемент массива ложу то что находится между Разделитель_2 и Разделитель_2.
и т.д.
Тем самым кол-во элементов выходного массива будет равно кол-ву знаков %.
0
5395 / 4323 / 1060
Регистрация: 29.08.2013
Сообщений: 27,129
Записей в блоге: 3
19.10.2017, 15:03 18
а можно понятный пример?
0
12 / 10 / 5
Регистрация: 22.07.2015
Сообщений: 215
19.10.2017, 15:25  [ТС] 19
Цитата Сообщение от qwertehok Посмотреть сообщение
а можно понятный пример?
Delphi
1
2
3
4
5
S:='Жили-были_муж_с женой, и была у них_дочка.';
Pattern1:='%муж%дочка%';      //шаблон_1 для примера.
Pattern2:='%муж%бабушка%';  //шаблон_2 для примера.
Flag1:=Razbor(S,Pattern1,A);
Flag2:=Razbor(S,Pattern2,A);
И так получаем:
Flag1=true так как искомый шаблон есть в строке S.
Соответственно, получаем массив A c 3 элементов:
[1]='Жили-были_'
[2]='_с женой, и была у них_'
[3]='.'
Flag1=false;
Соответственно, массив A очищаем. A^=Nil;
0
Модератор
9256 / 6034 / 2379
Регистрация: 21.01.2014
Сообщений: 25,793
Записей в блоге: 3
19.10.2017, 15:25 20
Setix, я вот смотрю-смотрю и все не понимаю: ну что Вы уперлись в этот, так сказать, "шаблон"? Почему нельзя сделать массив возможных разделителей? Тогда Ваша задача решается в 3-4 строки...
0
19.10.2017, 15:25
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.10.2017, 15:25
Помогаю со студенческими работами здесь

Поиск строки из переменной по шаблону
Всем привет :victory: Помогите нубу... В общем смысл такой: Есть файл текстовый с разными...

SED Удаление строки по шаблону
Добрый день! Помогите, пожалуйста, решить задачу. Скажем имеется текст: 2169 989172934523 ...

Генератор строки по заданному шаблону
Помогите с кодом. Нужно генерировать строку подобным образом: 0 1 ... 9 a b ...

C# Поиск строки в файле по шаблону
Нужно найти в файле по шаблону строку и вывести часть строки Пример: ID:95 ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru