powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая замена \b в regexp
13 сообщений из 13, страница 1 из 1
Простая замена \b в regexp
    #40058449
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не подскажите, чем можно заменить \b в регулярном выражении?
Нужно отфильтровать российские номера мобильных телефонов, после которых допустим произвольный суффикс (после пробела).
Самым правильным был бы шаблон "^79\d{9}\b". Просто "^79\d{9}" допускает наличие более 11 цифр в номере.

Код: plsql
1.
2.
with s as (select '123' n from dual union select '1234' from dual union select '123 ' from dual union select '123 123' from dual)
select n, regexp_substr(n, '^\d{3}') as re from s


Для 1234 должен выдать null.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058479
Фотография Валерий Юринский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.,

Код: plaintext
1.
2.
В Казахстане используется совместный с Россией четырёхуровневый 
открытый план нумерации с международным кодом +7. 
За Казахстаном закреплены диапазоны +7 6XX и +7 7XX (X = от 0 до 9).

Может быть будет проще "отфильтровать российские номера мобильных телефонов" по этим диапазонам?
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058485
exciter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.Для 1234 должен выдать null.
для этого тестового примера:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
with s (n) as 
(
select '123' from dual 
union all 
select '1234' from dual 
union all 
select '123 ' from dual 
union all
select '123 123' from dual
)
select n, regexp_substr(n, '^\d{3}($|\D)') as re from s
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058487
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Просто "^79\d{9}" допускает наличие более 11 цифр в номере.
Кроме якоря начала, есть и якорь конца.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058508
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exciter
regexp_substr(n, '^\d{3}($|\D)')

Да, мысль неплохая.
Но в результат (столбец) попадет и \D, а я хотел бы получить "чистый" номер (или null).

Elic
Кроме якоря начала, есть и якорь конца.

Я это знаю. Только не пойму, чем это поможет.
Если речь о шаблоне "^79\d{9}($|\s.+)" (или как предложили "^79\d{9}($|\D)"), то он все же \b не заменяет, так как в результат попадают символы, которые я бы не хотел включать в результат. И look ahead использовать не могу, так как не поддерживается.

Мне бы хотелось обойтись одним несложным шаблоном в regexp_substr, получив сразу готовый к использованию результат и не используя более сложную конструкцию case when regexp_like then regexp_substr end или regexp_replace (потому что тогда удобнее фильтровать на клиенте).
Если в пределах поддержки ораклом регулярных выражений это сделать нельзя, значит сделаю на клиенте. Но может быть можно, просто я не знаю как.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058510
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валерий Юринский
Может быть будет проще "отфильтровать российские номера мобильных телефонов" по этим диапазонам?

Имеется ввиду что-то вроде between '79000000000' and '79999999999' ? В поле после цифр может быть указан пробел и суффикс, поэтому так не получится.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058515
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alibek B.
Если речь о шаблоне "^79\d{9}($|\s.+)" (или как предложили "^79\d{9}($|\D)"), то он все же \b не заменяет, так как в результат попадают символы, которые я бы не хотел включать в результат. И look ahead использовать не могу, так как не поддерживается.
у regexp_substr есть параметр subexpr.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058535
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да.
К сожалению мне этот параметр недоступен .
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058565
exciter
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Alibek B.

Но в результат (столбец) попадет и \D, а я хотел бы получить "чистый" номер (или null).

Приведите более подробный пример тестовых данных и того, что хотите в итоге получить.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058628
Фотография SY
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Alibek B.
Да.
К сожалению мне этот параметр недоступен .


Ну неужели так трудно сделать SUBSTR

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
with s (n) as
(
select '123' from dual
union all
select '1234' from dual
union all
select '123 ' from dual
union all
select '123 123' from dual
union all
select '123abc' from dual
)
select n,substr(regexp_substr(n,'^\d{3}($|\D)'),1,3) as re from s
/
N       RE
------- ------------
123     123
1234
123     123
123 123 123
123abc  123

SQL>



SY.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058647
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
exciter
Приведите более подробный пример тестовых данных и того, что хотите в итоге получить.

Валидные значения — любые российские мобильные номера (79zzyyyxxxx), к которым разрешено через пробел добавлять произвольный суффикс. Например "79876543210", "79876543210 ", "79876543210 123" — валидные значения. Все остальные варианты — невалидны, например "798765432100", "7987654321", "79876543210abc".
Я бы хотел получить (минимальными усилиями) либо чистый номер (для валидных значений), либо null.

SY
Ну неужели так трудно сделать SUBSTR

Конечно можно, ведь телефонный номер имеет фиксированную длину.
Я еще тут ( 22302469 ) эту задачу решил.
Но на будущее хотел бы знать, можно ли выбрать фрагмент по границе слова \b с помощью доступных шаблонов для общего случая.
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058662
Фотография Sayan Malakshinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Alibek B.,

+regexp_replace
...
Рейтинг: 0 / 0
Простая замена \b в regexp
    #40058677
Alibek B
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если имеется ввиду regexp_replace(str, '^(79\d{9})( .+)?$', '\1'), то я как раз от этого хотел уйти.
ИМХО substr(regexp_substr(str, '^79\d{9}($|\D)'), 1, 11) лучше и быстрее.
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Простая замена \b в regexp
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]