AXForum  
Zurück   AXForum > Microsoft Dynamics AX > DAX: Программирование
All
Kennwort vergessen?
Registrieren Forum Rules Hilfe Benutzerliste Heutige Beiträge Suchen

 
 
Themen-Optionen Thema durchsuchen Ansicht
Alt 07.04.2016, 09:57   #1  
demianimp ist offline
demianimp
Участник
 
202 / 104 (4) +++++
Registriert seit: 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, ['\"', '\'', '&'], ['`', '`', '_']);
Alt 07.04.2016, 10:32   #2  
Ruff ist offline
Ruff
Дмитрий Ерин
Benutzerbild von Ruff
1C
 
475 / 396 (14) ++++++
Registriert seit: 18.09.2003
Ort: Тула
Когда заменяющий символ один и тот же, можно через регулярку:
X++:
    TextBuffer tb = new TextBuffer();
    ;
    tb.setText("ООО 'Рога & копыта\"");
    tb.regularExpressions(true);

    tb.replace('["\'&]', '`');
    info(tb.getText());
__________________
This post has been rated by: demianimp (1), SuperStar88 (1).
Alt 07.04.2016, 11:01   #3  
S.Kuskov ist offline
S.Kuskov
Участник
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
 
3.448 / 1792 (66) ++++++++
Registriert seit: 28.04.2007
Ort: Калуга
Регулярные выражения можно использовать через Net. Если версия аксапты позволяет )
X++:
info(System.Text.RegularExpressions.Regex::Replace("ООО 'Рога & копыта\"", '["\'&]', '`'));
This post has been rated by: Damn (2), demianimp (1).
Alt 07.04.2016, 11:35   #4  
demianimp ist offline
demianimp
Участник
 
202 / 104 (4) +++++
Registriert seit: 10.10.2013
Zitat:
Zitat von Ruff Beitrag anzeigen
Когда заменяющий символ один и тот же, можно через регулярку:
X++:
    TextBuffer tb = new TextBuffer();
    ;
    tb.setText("ООО 'Рога & копыта\"");
    tb.regularExpressions(true);

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

На мой взгляд более универсальное решение, но могу ошибаться.
Alt 07.04.2016, 11:40   #5  
Владимир Максимов ist offline
Владимир Максимов
Участник
КОРУС Консалтинг
 
1.715 / 1204 (44) ++++++++
Registriert seit: 13.01.2004
Blog-Einträge: 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++, думаю, будет не очень сложно
__________________
- Может, я как-то неправильно живу?!
- Отчего же? Правильно. Только зря...

Geändert von Владимир Максимов (07.04.2016 um 12:48 Uhr)
Alt 07.04.2016, 11:53   #6  
demianimp ist offline
demianimp
Участник
 
202 / 104 (4) +++++
Registriert seit: 10.10.2013
Zitat:
Zitat von Владимир Максимов Beitrag anzeigen
Насколько я вижу, в постановке задачи речь идет не о регулярных выражениях, а о последовательной замене. Как "зарядка для ума" описанный метод подойдет. Но лично я бы просто написал 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.

Или я просто себе лишнею проблему придумал?
Alt 07.04.2016, 12:10   #7  
Ruff ist offline
Ruff
Дмитрий Ерин
Benutzerbild von Ruff
1C
 
475 / 396 (14) ++++++
Registriert seit: 18.09.2003
Ort: Тула
Zitat:
Zitat von demianimp Beitrag anzeigen
заменить 100 strReplace на один strReplaceContainer?
....
Или я просто себе лишнею проблему придумал?
Вот для 100 замен (да даже для 10+ замен) - точно лишняя проблема. Как минимум для тех, кому придется этот код поддерживать, модифицировать. В 100 интуитивно понятных строках кода найти нужное соответствие не составит труда, а вот считать элементы в длинных контейнерах, чтобы что-то поменять... мозг вскипит

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

 

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Поррассуждаем? Как лучше работать с парой связанных значений в классах? (например, 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

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Gehe zu

Рейтинг@Mail.ru
Alle Zeitangaben in WEZ +3. Es ist jetzt 08:49 Uhr.
Powered by vBulletin® Version 3.8.5 (Deutsch)
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.