4

我想获取满足特定条件的文本字符串的电话号码:

  • 9 个字符(数字)
  • 您只能从 9,8,7,6 开始

我尝试了以下表达式:

'^\(?(9|8|7|6)\)?([0-9]{8}))$' 

在以下函数中:

DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)

SET @str = 'TESTING1234 997711056'
SET @validchars = '^\(?(9|8|7|6)\)?([0-9]{8}))$' 

WHILE PATINDEX('%' + @validchars + '%',@str) > 0
SET @str=REPLACE(@str, SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 1) ,'')


SELECT @str

我需要得到 997711056 但我总是得到完整的文本字符串。我的错误是什么?

4

2 回答 2

6

PATINDEX不是正则表达式函数。您只能使用一组有限的模式标识符和通配符。来自MSDN

% :任何零个或多个字符的字符串。
_(下划线):任何单个字符。
[] :指定范围 ([af]) 或集合 ([abcdef]) 内的任何单个字符。
[^] : 不在指定范围 ([^af]) 或集合 ([^abcdef]) 内的任何单个字符。

以下将连续匹配九位数字,从 6、7、8 或 9 开始:

SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'

您对SUBSTRING的使用也不正确。看起来您的代码正试图从字符串中删除数字的字符。以下是如何获取删除数字的字符串:

DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)

SET @str = 'TESTING1234 997711056 sdfgdfg'
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@str)
IF @idx > 0 AND 
    (@idx = LEN(@str)-8
    OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0)
    SET @str=REPLACE(@str,SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9),'')
ELSE SET @str = ''
SELECT @str

您声明您只想从字符串中检索数字;这是如何做到的:

DECLARE @str VARCHAR(MAX)
DECLARE @validchars VARCHAR(MAX)

SET @str = 'TESTING1234 997711056 sdfgdfg'
SET @validchars = '[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]'
DECLARE @idx INT
SET @idx = PATINDEX('%'+ @validchars +'%',@str)
IF @idx > 0 AND 
    (@idx = LEN(@str)-8
    OR PATINDEX(SUBSTRING(@str,@idx+9,1),'[0-9]')=0)
    SET @str=SUBSTRING(@str ,PATINDEX('%'+ @validchars +'%',@str), 9)
ELSE SET @str = ''
SELECT @str
于 2013-05-24T17:30:57.817 回答
2

试试这个:

DECLARE @str VARCHAR(MAX) 

---- returns 997711056
SET @str= 'TESTING1234 997711056'
---- returns NULL
--SET @str= 'TESTING1234 0997711056'
---- returns NULL
--SET @str= 'TESTING1234 9977110560'
---- returns 997711056
--SET @str= '997711056'
---- returns NULL
--SET @str= '0997711056'
---- returns NULL
--SET @str= '9977110560'
---- returns NULL
--SET @str= 'test'

DECLARE @pat NVARCHAR(100) = '%[6-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%'
DECLARE @len INT = 9
DECLARE @ind INT = PATINDEX(@pat, @str)

SELECT  CASE WHEN
            ISNUMERIC(SUBSTRING(@str, @ind - 1, 1)) = 1 OR ISNUMERIC(SUBSTRING(@str, @ind + @len, 1)) = 1 THEN NULL 
        ELSE
            SUBSTRING(@str, NULLIF(@ind, 0), @len)
        END

PATINDEX不打算匹配正则表达式,因为它的用法请阅读有关它的 MSDN 文章

如果您只想提取数字,则不需要WHILE循环。

对于字符串中没有以数字 6-9 开头的 9 位数字的可能性,此代码将返回NULL.

于 2013-05-24T17:34:42.253 回答