AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 07.04.2016, 09:57   #1  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Post strReplace для нескольких значений
Друзья, прошу посмотреть код и дать совет.

Появилась необходимость в строке заменить несколько символов.
Например: ОАО "Какая-то компания и сим'вол" , нужно ' и " заменить на `.

Первое, что приходит на ум это strReplace(strReplace()), но что делать если символов много? (больше одно уже много)

Я написал следующий метод в Global:
X++:
static str strReplaceContainer(str _str, container _fromStrCon, container _toStrCon)
{
    int     i;
    str     fromStr,
            toStr;
    ;
    if(conLen(_fromStrCon) != 0 && conLen(_toStrCon) != 0)
    {
        for(i = 1; i <= conLen(_fromStrCon); i++)
        {
            fromStr = conPeek(_fromStrCon, i);
            toStr   = conPeek(_toStrCon, i < conLen(_toStrCon) ? i : conLen(_toStrCon));

            _str = strReplace(_str, fromStr, toStr);
        }
    }

    return _str;
}
Благодаря этому методу можно заменить вот такой код
X++:
    strReplace(strReplace(strReplace(custTable.Name, '\"', '`'),'\'', '`'), '&', '_');
на
X++:
    strReplaceContainer(custTable.Name, ['\"', '\'', '&'], ['`', '`', '_']);
Старый 07.04.2016, 10:32   #2  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Когда заменяющий символ один и тот же, можно через регулярку:
X++:
    TextBuffer tb = new TextBuffer();
    ;
    tb.setText("ООО 'Рога & копыта\"");
    tb.regularExpressions(true);

    tb.replace('["\'&]', '`');
    info(tb.getText());
__________________
За это сообщение автора поблагодарили: demianimp (1), SuperStar88 (1).
Старый 07.04.2016, 11:01   #3  
S.Kuskov is offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3,429 / 1772 (66) ++++++++
Регистрация: 28.04.2007
Адрес: Калуга
Регулярные выражения можно использовать через Net. Если версия аксапты позволяет )
X++:
info(System.Text.RegularExpressions.Regex::Replace("ООО 'Рога & копыта\"", '["\'&]', '`'));
За это сообщение автора поблагодарили: Damn (2), demianimp (1).
Старый 07.04.2016, 11:35   #4  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Ruff Посмотреть сообщение
Когда заменяющий символ один и тот же, можно через регулярку:
X++:
    TextBuffer tb = new TextBuffer();
    ;
    tb.setText("ООО 'Рога & копыта\"");
    tb.regularExpressions(true);

    tb.replace('["\'&]', '`');
    info(tb.getText());
Цитата:
Сообщение от S.Kuskov Посмотреть сообщение
Регулярные выражения можно использовать через Net. Если версия аксапты позволяет )
X++:
info(System.Text.RegularExpressions.Regex::Replace("ООО 'Рога & копыта\"", '["\'&]', '`'));
Это очень сильно подходит, когда нужно заменить на что-то одно.
Мой алгоритм позволяет это сделать, а еще он позволяет заменить конкретные значения на другие значения. Например V на В, P на П и т.п.

На мой взгляд более универсальное решение, но могу ошибаться.
Старый 07.04.2016, 11:40   #5  
Владимир Максимов is offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1,652 / 1158 (42) ++++++++
Регистрация: 13.01.2004
Записей в блоге: 3
Насколько я вижу, в постановке задачи речь идет не о регулярных выражениях, а о последовательной замене. Как "зарядка для ума" описанный метод подойдет. Но лично я бы просто написал 3 последовательных замены

X++:
str strName;

strName = custTable.Name;
strName = global::strReplace(strName, '\"', '`');
strName = global::strReplace(strName, '\'', '`');
strName = global::strReplace(strName, '&', '_');

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

Если так уж хочется написать посимвольную замену, то имеет смысл не использовать существующий метод global::strReplace(), а написать свой собственный, где в качестве параметра передаются две строки с наборами символов. Не замена текста на текст, а замена каждого символа из первого параметра на соответствующий символ из второго.

Чтобы было понятно о чем речь, есть функция ChrTran в FoxPro. Вот ее описание

https://msdn.microsoft.com/en-us/lib...(v=vs.71).aspx

Написать ее аналог в X++, думаю, будет не очень сложно
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Последний раз редактировалось Владимир Максимов; 07.04.2016 в 12:48.
Старый 07.04.2016, 11:53   #6  
demianimp is offline
demianimp
Участник
 
202 / 104 (4) +++++
Регистрация: 10.10.2013
Цитата:
Сообщение от Владимир Максимов Посмотреть сообщение
Насколько я вижу, в постановке задачи речь идет не о регулярных выражениях, а о последовательной замене. Как "зарядка для ума" описанный метод подойдет. Но лично я бы просто написал 3 последовательных замены

X++:
str strName;

strName = custTable.Name;
strName = global::strReplace(strTest, '\"', '`');
strName = global::strReplace(strTest, '\'', '`');
strName = global::strReplace(strTest, '&', '_');

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

Если так уж хочется написать посимвольную замену, то имеет смысл не использовать существующий метод global::strReplace(), а написать свой собственный, где в качестве параметра передаются две строки с наборами символов. Не замена текста на текст, а замена каждого символа из первого параметра на соответствующий символ из второго.

Чтобы было понятно о чем речь, есть функция ChrTran в FoxPro. Вот ее описание

https://msdn.microsoft.com/en-us/lib...(v=vs.71).aspx

Написать ее аналог в X++, думаю, будет не очень сложно
Моя вина, неудачный пример взял =) Все зацепились за один символ.

Можно и 100 раз использовать strReplace в коде, но зачем все тянуть в код, если можно заменить 100 strReplace на один strReplaceContainer? Если что-то одно поменять нужно то используем strReplace, если несколько значений, то strReplaceContainer.

Или я просто себе лишнею проблему придумал?
Старый 07.04.2016, 12:10   #7  
Ruff is offline
Ruff
Дмитрий Ерин
Аватар для Ruff
1C
 
475 / 396 (14) ++++++
Регистрация: 18.09.2003
Адрес: Тула
Цитата:
Сообщение от demianimp Посмотреть сообщение
заменить 100 strReplace на один strReplaceContainer?
....
Или я просто себе лишнею проблему придумал?
Вот для 100 замен (да даже для 10+ замен) - точно лишняя проблема. Как минимум для тех, кому придется этот код поддерживать, модифицировать. В 100 интуитивно понятных строках кода найти нужное соответствие не составит труда, а вот считать элементы в длинных контейнерах, чтобы что-то поменять... мозг вскипит

Теоретически подход с контейнером наверно имеет преимущества, если он наполняется динамически, в зависимости от каких-то условий, действий пользователя и т.п. Но у меня сейчас не получается придумать практического примера такого применения.
__________________
Старый 07.04.2016, 12:43   #8  
terraByteG is offline
terraByteG
Участник
 
15 / 17 (1) ++
Регистрация: 10.03.2016
Цитата:
Сообщение от demianimp Посмотреть сообщение
Можно и 100 раз использовать strReplace в коде, но зачем все тянуть в код, если можно заменить 100 strReplace на один strReplaceContainer? Если что-то одно поменять нужно то используем strReplace, если несколько значений, то strReplaceContainer.
Глаза не боитесь сломать, выискивая потом какой элемент на кокой меняется, хотя бы 10+ уже истерия может начаться...
Проще Copy/Paste strReplace сделать...
Теги
ax2009, strreplace

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
Поррассуждаем? Как лучше работать с парой связанных значений в классах? (например, nullable) mazzy DAX: Программирование 9 11.06.2015 12:06
Универсальный изменятель значений полей wojzeh DAX: Программирование 17 26.09.2013 17:47
AX2009, Enterprise Portal, как на web странице скрыть одно из значений BaseEnum с помощью конфигурационного ключа wander721 DAX: Программирование 1 08.08.2012 01:36
Последовательная замена множества уникальных значений на другие без возникновения дубликатов gl00mie DAX: Программирование 23 24.11.2010 15:05
axaptapedia: StrReplace Blog bot DAX Blogs 0 04.02.2009 19:05

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 07:51.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.