07.04.2016, 09:57 | #1 |
Участник
|
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 |
Дмитрий Ерин
|
Когда заменяющий символ один и тот же, можно через регулярку:
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 |
Участник
|
Регулярные выражения можно использовать через Net. Если версия аксапты позволяет )
X++: info(System.Text.RegularExpressions.Regex::Replace("ООО 'Рога & копыта\"", '["\'&]', '`')); |
|
|
За это сообщение автора поблагодарили: Damn (2), demianimp (1). |
07.04.2016, 11:35 | #4 |
Участник
|
Цитата:
Цитата:
Мой алгоритм позволяет это сделать, а еще он позволяет заменить конкретные значения на другие значения. Например V на В, P на П и т.п. На мой взгляд более универсальное решение, но могу ошибаться. |
|
07.04.2016, 11:40 | #5 |
Участник
|
Насколько я вижу, в постановке задачи речь идет не о регулярных выражениях, а о последовательной замене. Как "зарядка для ума" описанный метод подойдет. Но лично я бы просто написал 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 |
Участник
|
Цитата:
Сообщение от Владимир Максимов
Насколько я вижу, в постановке задачи речь идет не о регулярных выражениях, а о последовательной замене. Как "зарядка для ума" описанный метод подойдет. Но лично я бы просто написал 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 |
Дмитрий Ерин
|
Цитата:
Теоретически подход с контейнером наверно имеет преимущества, если он наполняется динамически, в зависимости от каких-то условий, действий пользователя и т.п. Но у меня сейчас не получается придумать практического примера такого применения.
__________________
|
|
07.04.2016, 12:43 | #8 |
Участник
|
Цитата:
Проще Copy/Paste strReplace сделать... |
|
Теги |
ax2009, strreplace |
|
|