|
|
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
Добрый день. Столкнулся тут с задачкой, выношу на суд общественности Есть некая система, которая работает с телефонными номерами. Система позволяет задвать маску для поля. В записи маски используются следующие правила: 9 - на этом месте указывается цифра \<символ> - константный символ Таким образом, для телефона РФ маска может быть записана в виде Код: plaintext Задача 1 - запросом отформатировать сохраненные телефонные номера по маске. Запрос должен работать для произвольной маски, записанной по правилам (рассматриваем только номера РФ, записанные в формате 10 цифр, например, 4959009876 или 8005554212, корректность маски и проверять не нужно - это обеспечивает система) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Задача 2 - запросом убрать маску с номеров, записанных в формате маски (система передает номера в соответствии с маской, проверять на корректность не требуется - т.е. +7(495)900-98-76 преобразовать в 4959009876). Запрос так же должен работать для произвольной маски. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 12:43 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainЗадача 2 Код: plsql 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 12:54 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
Elic, красиво, но если добрый пользователь вколотит маску с цифровой константой на конце - не сработает Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:03 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainElic, красиво, но если добрый пользователь вколотит маску с цифровой константой на конце - не сработает Но ведь ты сказал, что маски всего три и корректность введенного телефона проверяется "системой". ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:12 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainЗапрос должен работать для произвольной маски, записанной по правилам То что я привел - это лишь примеры, этим фантазия не ограничивается. По задаче 2 кстати я нашел два разных варианта. regexp есть в обоих, но они принципиально разные ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:16 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
AmKadНо ведь ты сказал, что маски всего три и корректность введенного телефона проверяется "системой". корректность в том, что не требуется проверять синтаксис маски на корректность, а так же в задаче 1 не требуется проверять число значащих позиций в маске и в номере - они совпадают (если не совпадает, оно отбрасывается ранее) в задаче 2 не требуется проверять совпадение входных данных с маской - как раз это и обеспечивает система. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:23 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brain, Нужно четкое и непротиворечивое описание как и что парсить. И примеры. Лично я пока ничего не понял . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:30 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
AmKad, мне показалось что описано нормально. Суть - номер записанный как 10 цифр отобразить в виде, задающемся маской, и наоборот, если номер записан по маске, включая разные доп. символы (в т.ч. они могут быть цифровыми и в произвольных местах) - эти доп.символы убрать. В маске символ "9" обозначает позицию цифры, экранирующий \ обозначает символ, следующий за ним, как есть. Маска может быть произвольной абсолютно, но должна записываться по правилам (т.е. любой символ не являющийся "9" экранируется, "9" может быть заэкранирована) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:41 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
Примеры: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. В обратную сторону думаю понятно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 13:51 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainElic, красиво, но если добрый пользователь вколотит маску с цифровой константой на конце - не сработает Задачу нужно озвучивать внятно. Да и непонятно с какого бодуна цифры будут использоваться как разделители. Ну да ладно. Если число групп <= 9: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 14:54 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainЗадача 2Думаю из-за ограничений оракловых регулярок без разбиения строки в том или ином виде не решается для числа групп девяток более 9. Соотвественно, либо посимвольное разбиение либо выдирание групп девяток из исходного номера подшаманив над маской. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 15:15 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
Со второй задачей почти разобрались способ №2 - чисто на regexp (я его сделал позже способа №1) - влоб с подсчетом количества групп Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. А отсюда и до решения задачи 1 недалеко dbms_photoshopДумаю из-за ограничений оракловых регулярок без разбиения строки в том или ином виде не решается для числа групп девяток более 9. Это был способ №1 - я его придумал раньше - просто вспомнив что поняте "маска" может трактоваться как "битовая маска" - и он не имеет ограчиней на группы Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 15:38 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainчисто на regexpразрезать и склеить значит "чисто на regexp"? Как уже было сказано, из-за ограничений оракловых регулярок для общего случая надо резать и клеить, в результате чего натягивание этого алгоритма на SQL не более чем баловство. Использование встроенных PL/SQL пакетов для RAW - тоже просто замыливание глаз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 15:48 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
Свое решение по задаче №1 я опубликую в понедельник. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 16:52 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
#1 в лоб :) Не решал пока вариант c '\\', финальный replace можно заменить каким-нибудь хитрым регекспом. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 17:31 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainСо второй задачей почти разобрались способ №2 - чисто на regexp (я его сделал позже способа №1) - влоб с подсчетом количества групп Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. Ты слишком усложнил - весь этот listagg совершенно не нужeн. Ссылка на несуществующий backreference замещается NULL, так-что достаточно '\1\2\3\4\5\6\7\8\9'. И группы из одной цифры создавать тоже ненужно - их ведь может быть всего 9. Используй не (9) --> (\d) a (9+) --> (\d+) как в моем примере: Код: plsql 1. 2. 3. 4. 5. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 18:13 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
SY, Именно твой вариант я бы запустил, если бы задачу внезапно не сняли :) rpovarov, слишком перегружено. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 18:53 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
slow brainСвое решение по задаче №1 я опубликую в понедельник. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 20:29 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
SY, А с какой целью публикуется сие? Я понимаю rpovarov может оттачивает мастерство с rec with, но в вашем случае в чем смысл? Если на SQL идет попытка натянуть не SQL задачу так давайте это сделаем еще самым бредовым способом? Если у нас есть 10 млн масок по 15 символов так давайте запихаем в workarea 150 млн строк и будем по ним бегать. Затем фильтранем набор последней итерации. Зато SQL. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 06.10.2017, 21:03 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopЕсли у нас есть 10 млн масок по 15 символов так давайте запихаем в workarea 150 млн строк и будем по ним бегать. Ну а почему ты решил что "10 млн масок"? Их может быть весьма ограниченное количество. И вызываться это будет например только когда клиент зашел на сайт чтобы показать его номер в привычной для географии клиента форме. Хотя согласен, хранить и номер и "отмаскированный" номер более разумно. SY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2017, 02:12 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
имхо тут только в лоб (баловался не глядя других постов кроме стартового): задача 1: вариант 1 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. вариант 2 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. с to_char Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. c utl_lms гораздо проще Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2017, 03:53 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
dbms_photoshopSY, Я понимаю rpovarov может оттачивает мастерство с rec with Именно так. Балуюсь, пятничное же :) IMHO такие вещи надо вообще убирать из базы, пусть frontend (или какой другой потребитель) сам конвертирует. Или жёстко ограничивать на количество знаков, чтобы работали решения, которые показали SY и xtender. И потом бить ногами любого, кто придёт с идеей менять количество позиций. У меня на задания типа "...рассматриваем только номера РФ, записанные в формате 10 цифр..." срабатывает внутренний сигнал тревоги, потому что после подготовки красивого и элегантного решения с вероятностью 90% приходит вводная "формат может быть от 8 до 12 цифр". И надо переделывать, иногда полностью. Это не шпилька в сторону автора темы, просто из опыта работы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.10.2017, 13:01 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
Решение №1 с помощью MODEL (за образец взял код dbms_photoshop). - обрабатываются '\9' и '\\' (временной заменой на "непечатные" символы) - произвольное количество знаков (само собой, номер должен соответствовать маске) Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2017, 17:36 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
rpovarov, Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2017, 17:45 |
|
||
|
Пятничные телефонные маски
|
|||
|---|---|---|---|
|
#18+
xtender, Точно, спасибо. Надо поменять очерёдность // и /9. Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.10.2017, 19:13 |
|
||
|
|

start [/forum/topic.php?fid=52&msg=39532181&tid=1885139]: |
0ms |
get settings: |
6ms |
get forum list: |
9ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
52ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
39ms |
get tp. blocked users: |
1ms |
| others: | 190ms |
| total: | 310ms |

| 0 / 0 |
