2017-02-13 1 views
0

У меня есть столбец типа text, который содержит случайные значения. Некоторые из них - это числа, некоторые другие тексты и некоторые другие смешанные тексты и цифры. Я пытаюсь различить их как:PostgreSQL, регулярное выражение для соответствия текстовым полям с числовыми значениями

myfield is_numeric 
____________________ 
-4  true 
0004  true 
4.00  true 
dog  false 
D04  false 
04f  false 

В то время как другие - это имена и другие строки. Я использовал регулярное выражение

SELECT id, 
     myfield 
     (myfield::varchar~ '^-?[0-9]*.?[0-9]*$') is_numeric 
FROM mytable 

Чтобы сообщить, что строка содержит действительное число или нет. Однако я заметил, что такие значения, как D04 и 04c, возвращают true для этого регулярного выражения, которое для моего случая использования является ложным положительным.

Почему это происходит? Кажется, что ^ соответствует не обязательно целому значению, но любой допустимой подстроке значения. Однако значения, такие как D04f, возвращают false, поэтому даже если в поле есть числовая подстрока, то выполняет свою работу ^ и $.

Я временно прибегли к использованию:

SELECT id, 
     myfield 
     (myfield::varchar ~ '^-?[0-9]*.?[0-9]*$' 
     AND myfield::varchar !~ '[^0-9\-\.]') is_numeric 
FROM mytable 

Но это, кажется, inneficient (и не исключает двойные точки), и я до сих пор удивляюсь, почему регулярное выражение правильно исключает строки, которые начинаются и конец с нечисловым символом, в то время как notrecely возвращает true для строки, которая содержит только конечный или ведущий нецифровой символ.

+1

здесь: ''^-? [0-9] *.? [0-9] * $ '' эта часть '.?' Вы хотите быть любым символом или символом '.'? Если это второй, то нужно использовать scamed –

ответ

2

Будет ли это работать на вас?

^-?[0-9]+\.?[0-9]*$ 

Я asuming -0.07.5 недействителен (двойная точка присутствует).

D04 также вернет false.

Проблема в вашем исходном регулярном выражении состоит в том, что вы не избегаете точки, поэтому она будет соответствовать любому characher, включая D в вашем D04.

Надеюсь, это поможет.

+0

OMG, я снова и снова перебирал это регулярное выражение, и я не видел недостатка. Большое спасибо. – amenadiel

 Смежные вопросы

  • Нет связанных вопросов^_^