MySQL REGEXP с границей слова после косой черты

У меня есть несколько URL-адресов без http:// в таблице базы данных:

        url
row #1: 10.1.127.4/
row #2: 10.1.127.4/something

Теперь следующий фильтр дает мне строку № 2 - отлично:

SELECT * FROM mytable WHERE url REGEXP '[[:<:]]10.1.127.4/something[[:>:]]'

Но следующий фильтр не дает мне строку №1, а не должен ли?

SELECT * FROM mytable WHERE url REGEXP '[[:<:]]10.1.127.4/[[:>:]]'

Я должен отметить, что также экранирование косой черты с помощью обратной косой черты не возвращает желаемую строку № 1:

SELECT * FROM mytable WHERE url REGEXP '[[:<:]]10.1.127.4\/[[:>:]]'


person Anse    schedule 31.05.2016    source источник
comment
Попробуйте '[[:<:]]10.1.127.4/'   -  person Wiktor Stribiżew    schedule 31.05.2016
comment
Ну, я очень хочу, чтобы граница слова была справа :)   -  person Anse    schedule 31.05.2016
comment
Это не имеет смысла, между / и концом строки нет границы слова.   -  person Wiktor Stribiżew    schedule 31.05.2016
comment
Пожалуйста, укажите точные требования. Если вы хотите найти совпадение в конце строки или перед символом, отличным от alnum, используйте '[[:<:]]10[.]1[.]127[.]4/([[:>:]]|$)'. Точка должна быть либо экранирована, либо помещена в выражение в квадратных скобках.   -  person Wiktor Stribiżew    schedule 31.05.2016
comment
Если вам нужно сопоставить какие-либо числа (1 или более), используйте [0-9]+, и на самом деле /([[:>:]] будет соответствовать / перед alnum char. Если вам нужно обратное, используйте '[[:<:]]10[.]1[.]127[.]4/([^[:alnum:]]|$)'   -  person Wiktor Stribiżew    schedule 31.05.2016


Ответы (2)


Согласно документам: http://dev.mysql.com/doc/refman/5.7/en/regexp.html

[[:<:]], [[:>:]]

Эти маркеры обозначают границы слов. Они соответствуют началу и концу слов соответственно. Слово — это последовательность словесных символов, которой не предшествуют и не следуют словесные символы. Словесный символ — это буквенно-цифровой символ в классе alnum или знак подчеркивания (_).

/ не является членом альнума, поэтому это не граница слова.

person Marc B    schedule 31.05.2016
comment
/ не является элементом alnum, поэтому это не граница слова. - нет, границы слова нет между / и концом строки. Граница слова — это утверждение нулевой ширины. - person Wiktor Stribiżew; 31.05.2016

Выяснил, что [[:>:]] ожидает символ слова слева, и наоборот для [[:‹:]]

Простые тесты подтверждают, что:

SELECT 'bla,,123' REGEXP '[[:<:]]bla,[[:>:]]' -- no match
SELECT 'bla,,123' REGEXP '[[:<:]]bla[[:>:]]' -- match
SELECT 'bla,,123' REGEXP '[[:<:]]bla,,123[[:>:]]' -- match

Я думаю, что таким образом документация имеет смысл, и я неправильно понял это в течение нескольких лет:

[...] границы слов. Они соответствуют началу и концу слов, [...]

Итак, граница слова ожидает

  1. несловесный символ с одной стороны
  2. и символ слова с другой стороны
person Anse    schedule 01.06.2016