:: Visual Foxpro, Foxpro for DOS
шаблон текста
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Уважаемые знатоки! Нужно в текстовом поле сделать замену шаблона такого вида: '?-' заменить на 'С?-'. Где ? точно 1 цифра. Функция Strtran не позволяет использовать шаблон, насколько я понимаю? Каким образом можно выполнить такое действие?
Ratings: 0 negative/0 positive
Re: шаблон текста
of63

Сообщений: 25244
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Например так:
- заменяем в исходной строке (А) все цифры на какой-то символ, которого не бывает, например "#"
- теперь у нас 2 строки: А-исходная и Б-с подмененными цифрами
- создаем пустую строку В
- идем по строке Б, ищем вхождения троек "###": содержимое до этой тройки посылаем в строку В, саму тройку заменяем на содержимое из А (для этого у нас есть её координата в Б), причем добавляем к ней "С" и "-". Удобно откусывать обработанные начальные куски в А и Б, и в цикле каждый раз начинать с первого символа оставшейся строки А и Б...
() нетроекратные "###" придется по дорого как-то разруливать при помощи "ИИ", используя совпадающие координаты в А и Б
Ratings: 0 negative/0 positive
Re: шаблон текста
AngelOKES

Сообщений: 828
Дата регистрации: 08.02.2012
glaz58
Уважаемые знатоки! Нужно в текстовом поле сделать замену шаблона такого вида: '?-' заменить на 'С?-'. Где ? точно 1 цифра. Функция Strtran не позволяет использовать шаблон, насколько я понимаю? Каким образом можно выполнить такое действие?

Парочка примеров не помешала бы конечно, возможно там всё намного проще, из того что написано я понял только, что надо прибавить символ "С" к той строке, где встречается какая-то определённая комбинация трёх цифр
Ratings: 0 negative/0 positive
Re: шаблон текста
akvvohinc

Сообщений: 4216
Откуда: Москва
Дата регистрации: 11.11.2008
Решение "в лоб", не самое быстрое, но, думаю, будет наиболее понятным:
FUNCTION repl3dig
PARAMETERS s
LOCAL i,c,k_dig,k_repl
k_dig = 0 && счетчик последовательности цифр
k_repl = 0 && количество замен
FOR i=1 TO LEN(s)
c = SUBSTR(s,i+k_repl,1) && очередной символ
DO CASE
CASE ISDIGIT(c)
* это цифра -> наращиваем счетчик цифр
k_dig = k_dig+1
CASE c='-' AND k_dig>=3
* искомая подстрока найдена -> заменяем
s = STUFF(s,i-3+k_repl,0,'С')
k_repl = k_repl+1
k_dig = 0
OTHERWISE
* сбрасываем счетчик цифр
k_dig = 0
ENDCASE
ENDFOR
RETURN s
PS
Если перед '-' будет не 3, а больше цифр, то будет заменять последние 3 (в задании это не уточняется):
'1234-' --> '1С234-'



Исправлено 2 раз(а). Последнее : akvvohinc, 28.09.21 09:44
Ratings: 0 negative/0 positive
Re: шаблон текста
Владимир Максимов

Сообщений: 14097
Откуда: Москва
Дата регистрации: 02.09.2000
Это называется "регулярные выражения". Стандартно в среде FoxPro для этого нет инструментов. Ну, кроме посимвольного разбора строки. Но можно использовать внешние библиотеки. Как правило, используют библиотеку

"VBScript.RegExp"

Поищите на этом форуме. Есть примеры использования.

В принципе, есть в поставке FoxPro в библиотеке Foundation Class класс _regexp, но, по моему, проще напрямую использовать VPScript, ну как-то так

Local re as VBScript.RegExp
re = CreateObject("VBScript.RegExp")
re.Pattern = "[0-9][0-9][0-9]"
re.IgnoreCase = .t.
re.Global = .t.
loMatch = re.Execute("Пример 123-строки")
?loMatch.item(0).value

PS: Правильность синтаксиса не гарантирую. "На коленке" написал. Не проверял
Ratings: 0 negative/0 positive
Re: шаблон текста
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Удивительно, что уже столько ответов. Однако задача поставлена неясно. Что означает "заменить шаблон в текстовом поле"? Какой шаблон? Шаблон ввода? Если это шаблон ввода, то букву "С" можно "пририсовать" слева от шаблона '999' (если это цифры, то почему вопросительный знак вместо 9?) При такой "пририсовке" юзер "будет понимать", что буква "С" уже "введена заранее". После заполнения шаблона слева приписать букву С. И в шаблонах ввода символьных строк можно таки ставить цифры, что позволит вводить в этих позициях шаблона именно цифры.

Например,

myvar=space(15)
@ 0,0 GET myvar pict '999X9999X999999'
READ



Исправлено 2 раз(а). Последнее : Simple777, 28.09.21 11:19
Ratings: 0 negative/0 positive
Re: шаблон текста
akvvohinc

Сообщений: 4216
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Что означает "заменить шаблон в текстовом поле"?
Думаю, это текстовое поле в таблице, в котором надо заменить все последовательности
"цифра-цифра-цифра-минус"
на
"С-цифра-цифра-цифра-минус"
Ratings: 0 negative/0 positive
Re: шаблон текста
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
Если это так, то почему не добавить слева от значения поля букву С и на этом "закрыть вопрос"?
Ratings: 0 negative/0 positive
Re: шаблон текста
akvvohinc

Сообщений: 4216
Откуда: Москва
Дата регистрации: 11.11.2008
Потому что букву "С" надо добавить не перед значением поля, а в определённые места этой строки, и таких мест может быть от нуля и больше.
Места вставки "С" описаны в задании - перед каждой последовательностью символов "цифра-цифра-цифра-минус".

Например, строка:
АВС123-__23456-8
после обработки станет:
АВСС123-__23С456-8



Исправлено 1 раз(а). Последнее : akvvohinc, 28.09.21 15:29
Ratings: 0 negative/0 positive
Re: шаблон текста
Simple777

Сообщений: 33855
Дата регистрации: 05.11.2006
akvvohinc
Потому что букву "С" надо добавить не перед значением поля, а в определённые места этой строки, и таких мест может быть от нуля и больше.

Может быть, может быть. Но это лишь догадки.
Ratings: 0 negative/0 positive
Re: шаблон текста
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Если автор упомянул про strtran, то это практически факт, а не догадки

Дополню Владимира примером с заменой.

lcInput = "1234-ab56-CD7890-321-EFG-654321"
re = CreateObject("VBScript.RegExp")
re.Pattern = "(\d{3}-)"
re.Global = .T.
? re.Replace(m.lcInput, "C$1")

Шаблон поиска:
"\d" - любая десятичная цифра
"{3}" - предыдущий элемент повторяется строго 3 раза
"-" - в данном случае это просто символ минус
"()" - всё что внутри скобок (найденные символы соответствующие шаблону внутри скобок) будет трактоваться как "группа".

Шаблон замены очень прост - "$1" значит найденное значение первой группы - в шаблоне поиска может быть более одной пары скобок, тогда в результате может оказаться несколько групп. В данном случае у нас всего одна группа. Буква С - просто буква
re.Global = .T. включает режим замены всех найденных шаблонов, а не только первого.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: шаблон текста
Равиль

Сообщений: 6549
Откуда: Уфа
Дата регистрации: 01.08.2003
Вот спасибо ! Недавно коллега показывал как на питоне удобно работать с регулярками, а мне было нечем ответить кроме strtran ..


------------------
Тяжело согнать курсором муху с монитора ...
Ratings: 0 negative/0 positive
Re: шаблон текста
glaz58
Автор

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Именно это мне и нужно. Я думал, увижу что-нибудь более изящное, чем
If Isdigit(Substr(SHIFR,1,1)) And Isdigit(Substr(SHIFR,2,1)) And Isdigit(Substr(SHIFR,3,1)) And Substr(SHIFR,4,1)='-'
Replace SHIFR With 'С'+Alltrim(SHIFR)
Endif



Исправлено 1 раз(а). Последнее : glaz58, 04.10.21 13:28
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 20 (Гостей: 20)

© 2000-2024 Fox Club 
Яндекс.Метрика