从字符串中获取符号列表

时间:2015-01-26 11:18:51

标签: php mysql sql sql-server sql-server-2008

我的请求存在很大问题。例如,我有消息:

@NM1@ Hello @NM2@ How @NM3@ are @NM4@ you

我想提取:

@NM1@,@NM2@,@NM3@,@NM4@.

可以有多个@...@个表达式。在@ .. @之间可以不是任何字符

我试过了:

group_concat(regexp(em.value,'@[a-AA-Z0-9]*@'))

但没有结果。

请帮帮我。任何想法请!!!!!

2 个答案:

答案 0 :(得分:0)

如果这应该是一个PHP问题,如上所述,那么字符串可以这样找到:

<?php
    $string = "@NM1@Hello@NM2@How@NM3@are@NM4@you";

    preg_match_all('/@[A-Z]+[0-9]+/', $string, $matches);
    print(join(",", $matches[0]))."\n";
?>

这里我假设在@之后有字母字符,后跟数字,所以只匹配示例中以NM开头的字符串。

如果不是,你想要什么,请更具体。

答案 1 :(得分:0)

如果我理解你 - 使用像这样(或另一个)的分割函数 -

CREATE FUNCTION [dbo].[fnSplitString] 
( 
    @string NVARCHAR(MAX), 
    @delimiter CHAR(1) 
) 
RETURNS @output TABLE(splitdata NVARCHAR(MAX) 
) 
BEGIN 
    DECLARE @start INT, @end INT 
    SELECT @start = 1, @end = CHARINDEX(@delimiter, @string) 
    WHILE @start < LEN(@string) + 1 BEGIN 
        IF @end = 0  
            SET @end = LEN(@string) + 1

        INSERT INTO @output (splitdata)  
        VALUES(SUBSTRING(@string, @start, @end - @start)) 
        SET @start = @end + 1 
        SET @end = CHARINDEX(@delimiter, @string, @start)

    END 
    RETURN 
END

然后使用此代码

SELECT left(splitdata,len(splitdata)-1) AS substr
INTO #x1
FROM [dbo].[fnSplitString] ('@NM1@ Hello @NM2@ How @NM3@ are @NM4@ you',' ')
WHERE splitdata LIKE '@%' AND splitdata LIKE '%@'
--SELECT * FROM #x1
GO
DECLARE   cur CURSOR FAST_FORWARD READ_ONLY
FOR SELECT substr
FROM #x1
DECLARE @str varchar(100)=''
DECLARE @i varchar(10)
OPEN cur
 FETCH NEXT FROM cur INTO @i

WHILE @@FETCH_STATUS=0
BEGIN

SET @str = @str+@i+',' 
FETCH NEXT FROM cur INTO @i
END
CLOSE cur
DEALLOCATE cur
SELECT left(@str,len(@str)-1)
DROP table #x1